如何在 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_t
、int16_t
、int32_t
和 int64_t
和他们未签名的同行)。
还值得一提的是,在将值发送到任意硬件时,您需要注意值的字节顺序(假设值大于 int8_t
和 u_int8_t
)。但是,如果您只使用 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_t
、int16_t
、int32_t
和 int64_t
和他们未签名的同行)。
还值得一提的是,在将值发送到任意硬件时,您需要注意值的字节顺序(假设值大于 int8_t
和 u_int8_t
)。但是,如果您只使用 iOS 台设备,这不会成为问题。