2

cocoaasyncsocket を使用して、データ Google プロトコル バッファ ( http://code.google.com/p/metasyntactic/wiki/ProtocolBuffersを使用) を Java サーバーに送信しています。これはすべて問題ありませんが、メッセージ (protoToSend) > 128 バイトの場合、Java サーバーがメッセージの長さを正しく読み取ることができないため、問題が発生しています。Objective C から間違った長さを送信しているためだと思います。

現在、次のようにデータを送信しています。

AsyncSocket *socket;


- (void)sendProtoToServer:(RequestMessage *)protoToSend {
     NSData *d = [protoToSend data];
     int s = [protoToSend serializedSize];

     NSData *size = [NSData dataWithBytes:&s length:1];
     [socket writeData:size withTimeout:TIME_OUT tag:100];
     [socket writeData:d withTimeout:TIME_OUT tag:101];
}

何か案は?

前もって感謝します

4

1 に答える 1

1

長さはリトルエンディアンの varint でエンコードされていると思われます。これは、MSB を継続ビットとする 7 ビットのチャンクであることを意味します。MSB が設定されている場合は、次のバイト (など) を処理して結合された長さを取得し、ビットごとのシフトを使用してそれらを結合する必要があります。

実際、128 未満のすべての数値について、これは 1 バイトを読み取るのと同じように見えます。

base-128 varint のデコードに関する仕様については、こちらを参照してください。

于 2011-07-14T12:27:01.873 に答える