2011-06-17 159 views
2

我有以下方法:谷歌协议缓冲的Objective-C

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

我知道上面是非常错误的(在理解这一切只是我的黑客尝试)。我不知道如何获得长度超过128的邮件的正确长度。我认为这是与变种有关

有谁知道如何做到这一点?因为它让我疯狂。

在此先感谢。

回答

1

我想指出[NSData dataWithBytes:&s length:1][NSData dataWithBytes:&s length:2]没有做你期望的。例如,假设您的变量s等于十六进制值0xFFCCAA00。传递一个长度意味着数据的大小将是一个字节。传递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)]; 
+0

我觉得这是1/2战斗。它与GBP下的Variant有关 - 请参阅以下内容(请参阅Base 128 Variant部分): http://code.google.com/apis/protocolbuffers/docs/encoding.html – robert

+0

那么根据该文档我提供的代码是足够的,如果发送的长度受编码变体的影响,则2的长度足够小,不需要设置msb我将更新我的帖子以显示示例。如果这个问题帮助你通过告诉我和/或接受答案让我知道正确的长度:)。如果你在编写实际数据时遇到困难,因为变体会通过示例代码开始另一个问题,请随时在此处发布链接,以便我可以查看它。 – Joe

+0

嗨,但上面并没有什么意义。 如果S = 127,然后accoridng到DOC它是一个字节 如果S = 129那么这将是两个字节 但上面的更新不发送S,它仅发送长度... 我很困惑通过以上基本上:( – robert