2011-06-17 115 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