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

How to send int between 32bit and 64bit processors iOS

差不多就是标题,我使用 Gamekit 在结构中发送了一个 int,在接收端另一台设备得到了它。 在 64 位 cpu 秒(iPhone 5 秒及以上)之间,数字接收正常。但是当 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 显示:随机接收 number:0

NSInteger 在 64 位平台上将是 64 位,在 32 位平台上将是 32 位。如果您不关心 64 位精度,您始终可以使用 int32_t(或者 u_int32_t,如果您想要无符号)类型来显式地只使用 32 位值。在设备之间发送值时明确数据长度通常是明智的,这就是这些类型存在的目的(有 int8_tint16_tint32_tint64_t 和他们未签名的同行)。

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