2

我正在使用 cocoaasyncsocket 将数据 Google 协议缓冲区(使用http://code.google.com/p/metasyntactic/wiki/ProtocolBuffers)发送到 Java 服务器。这一切都很好,但是对于消息(protoToSend)>128bytes 我遇到了问题,因为 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

长度是 little-endian varint 编码的,大概是 - 这意味着它是 7 位的块,MSB 作为延续位。如果设置了 MSB,则需要处理下一个字节(依此类推)以获得组合长度,然后使用按位移位组合它们。

实际上,对于所有小于 128 的数字,这看起来确实与读取单个字节相同。

有关解码 base-128 varint的规范,请参见此处。

于 2011-07-14T12:27:01.873 回答