2015-10-19 38 views
0

非常多的標題,我使用Gamekit在結構中發送一個int,在接收端,其他設備獲取它。 在64位cpus(iPhone 5S及以上版本)數量收到罰款。但是,當一個iPhone 5獲得它(32位CPU)的int被接收爲0.什麼是正確的方式?如何在32位和64位處理器之間發送int iOS

我試過發送作爲NSInteger和結果是一樣的。

我必須添加我有這個問題與u_int_32t: 當設備連接時,每個設備交易隨機數。這些數字決定哪個球員開始,我用這個u_int_32t,然而,32位的CPU仍然收到0。例如:

我宣佈 uint32_t _ourRandomNumber;

然後,_ourRandomNumber = arc4random();

然後是數字在像這樣的結構中發送。

typedef struct { 
    Message message; 
    uint32_t randomNumber; 
} MessageRandomNumber; 

使用這樣的方法:

- (void)sendRandomNumber{ 
    MessageRandomNumber message; 
    message.message.messageType = kMessageTypeRandomNumber; 
    message.randomNumber = _ourRandomNumber; 
    NSData *data = [NSData dataWithBytes:&message length:sizeof(MessageRandomNumber)]; 
    [self sendData:data]; 
} 

當32位的CPU接收它然後在接收方法:

Message *message = (Message*)[data bytes]; 
if (message->messageType == kMessageTypeRandomNumber) { 
    MessageRandomNumber *messageRandomNumber = (MessageRandomNumber*)[data bytes]; 

    NSLog(@"Received random number:%d", messageRandomNumber->randomNumber); 

的的NSLog示出:接收的隨機數:0

回答

1

NSInteger將在64位平臺上爲64位,在32位平臺上爲32位。如果你不關心64位精度,那麼你總是可以使用int32_t(或者如果你想要無符號的話,可以使用u_int32_t)來顯式地使用一個32位的值。在設備之間發送值時明確說明數據長度通常是明智的,這些類型存在於這些類型中(有int8_t,int16_t,int32_tint64_t及其未簽名的對應項)。

還值得一提的是,當向任意硬件發送值時,您需要關心值的字節順序(假設值大於int8_t和)。但是,如果您只使用iOS設備,這不會成爲問題。

+0

感謝您的回覆。如果您發現爲什麼發送爲u_int32_t,則在另一端收到0,請查看編輯後的問題。 – Oscar

+0

什麼是'消息'?如果在結構中切換「Message」和「u_int32_t」的順序會怎樣? –

+0

消息是另一個結構,它幫助我知道接收到的是一個RandomNumber消息。 – Oscar