如何在32位和64位处理器iOS之间发送int

时间:2015-10-19 18:14:51

标签: ios cocoa-touch game-center gamekit

几乎是标题,我使用Gamekit在结构中发送一个int,在接收端使用其他设备获取它。 在64位cpus(iPhone 5S及以上)之间,这个数字很好。但是当一个iPhone 5获得它(32位cpu)时,int被收到为0.什么是正确的方式?

我尝试过发送NSInteger,结果是一样的。

我必须添加u_int_32t这个问题: 当设备连接时,每个设备交换随机数。这些数字决定了哪个玩家开始,而我正在使用u_int_32t,但是,32位cpus仍然会收到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 个答案:

答案 0 :(得分:1)

NSInteger将在64位平台上为64位,在32位平台上为32位。如果您不关心64位精度,则可以始终使用int32_t(或u_int32_t如果您希望无符号)类型明确使用32位值。通常明智的做法是在设备之间发送值时明确数据长度,这就是这些类型的存在(有int8_tint16_tint32_tint64_t以及他们的未签名同行。)

还值得一提的是,在向任意硬件发送值时,您需要关注值的字节顺序(假设值大于int8_tu_int8_t)。但是,如果您只使用iOS设备,则不会出现问题。