2

我正在使用cocoaasyncsocket将数据Google Protocol Buffers(使用http://code.google.com/p/metasyntactic/wiki/ProtocolBuffers)发送到Java服务器。这一切都很好,但对于消息(protoToSend)> 128bytes我遇到了问题,因为Java服务器无法正确读取消息长度,我认为是因为我从目标C发送了错误的长度。发送数据如下:cocoaasyncsocket发送数据> 128bytes(google协议缓冲区)

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]; 
} 

任何想法?

预先感谢

回答

1

长度是小端varint编码,想必 - 这意味着它是与MSB的7位数据块作为一个扩展位。如果设置了MSB,则需要处理下一个字节(依此类推)以获得组合长度,然后使用按位移组合它们。

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

See here for the spec解码base-128 varints。

+0

嗨,感谢您的快速响应。 是的,我明白你的意思,我想我需要使用CodedOutputStream将我的大小(int)转换为varint。 – robert