2015-10-19 65 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