Google协议缓冲区Objective-C
我有以下方法:Google协议缓冲区Objective-C,objective-c,variant,Objective C,Variant,我有以下方法: - (void)sendProtoToServer:(SampleMessage *)protoToSend { NSData *d = [protoToSend data]; int s = [protoToSend serializedSize]; if(s<128){ NSLog(@"<128"); NSData *size = [NSData dataWithBytes:&s length:1];
- (void)sendProtoToServer:(SampleMessage *)protoToSend {
NSData *d = [protoToSend data];
int s = [protoToSend serializedSize];
if(s<128){
NSLog(@"<128");
NSData *size = [NSData dataWithBytes:&s length:1];
[socket writeData:size withTimeout:TIME_OUT tag:100];
[socket writeData:d withTimeout:TIME_OUT tag:101];
} else {
NSLog(@">= 128");
NSData *size = [NSData dataWithBytes:&s length:2];
[socket writeData:size withTimeout:TIME_OUT tag:100];
[socket writeData:d withTimeout:TIME_OUT tag:101];
}
}
-(void)sendprotoserver:(SampleMessage*)protosend{
NSData*d=[协议发送数据];
int s=[protosend serialized];
如果(s我想指出[NSData dataWithBytes:&s length:1]
和[NSData dataWithBytes:&s length:2]
没有达到预期效果。例如,假设变量s
等于十六进制值0xFFCCAA00
。传递长度为1表示数据大小为一个字节。传递1表示大小等于0xFF(255),传递2表示大小等于0xFFCC(65484).您可能正在寻找的是以下内容
// >= 128
int length = 2;
NSData *size = [NSData dataWithBytes:&length length:sizeof(length)];
更新:
如果要通过发送单个字节,请尝试以下操作:
unsigned char length = 1;
// < 128
NSData *size = [NSData dataWithBytes:&length length:sizeof(length)];
// >= 128
length = 2;
NSData *size = [NSData dataWithBytes:&length length:sizeof(length)];
无符号字符长度=1;
// < 128
NSData*size=[NSData dataWithBytes:&length:sizeof(length)];
// >= 128
长度=2;
NSData*size=[NSData dataWithBytes:&length:sizeof(length)];
我认为这是一场1/2的战斗。它与GBP下的变体有关-请参见以下内容(请参见基本128变体部分):根据该文档,我提供的代码足够了,如果发送长度受编码变量a的影响,那么长度2足够小,不需要设置msb,我将更新我的帖子以显示示例。如果此问题帮助您发送正确的长度,请告诉我和/或接受答案,让我知道:)。如果因为变量而无法写入实际数据,请使用示例代码开始另一个问题,请随意在此处发布链接,以便我可以查看。您好,但上面的内容没有真正意义。如果s=127,则根据文档,它是一个字节如果s=129,则它将是两个字节,但上面的更新不会发送s,是吗只发送长度…我基本上被上面的内容弄糊涂了:(我对Google的缓冲区协议没有经验,但我认为您不必担心。从外观上看,serialize方法将为您处理所有编码,并包含传输数据所需的信息。然后,接收端可以反序列化该数据。我看到您正在将数据写入套接字,您要将其发送到哪里?服务器或其他设备上的自定义代码?