如何在 32 位和 64 位处理器 iOS 之间发送 int
Posted
技术标签:
【中文标题】如何在 32 位和 64 位处理器 iOS 之间发送 int【英文标题】:How to send int between 32bit and 64bit processors iOS 【发布时间】:2015-10-19 18:14:50 【问题描述】:几乎是标题,我使用 Gamekit 在结构中发送一个 int,而在接收端另一个设备得到它。 在 64 位 CPU(iPhone 5S 及以上)之间,该号码可以正常接收。但是当 iPhone 5 得到它(32 位 cpu)时,int 被接收为 0。正确的方法是什么?
我尝试以 NSInteger 发送,结果是一样的。
我必须补充一下,我对 u_int_32t 有这个问题: 当设备连接时,每个设备都会交换随机数。这些数字决定了哪个玩家开始,我为此使用 u_int_32t,但是,32bit 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 显示:Received random number:0
【问题讨论】:
【参考方案1】: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 设备,这将不是问题。
【讨论】:
感谢您的回复。如果您发现为什么发送为 u_int32_t, 0 在另一端收到,请查看已编辑的问题。 什么是Message
?如果在struct中切换Message
和u_int32_t
的顺序呢?
Message 是另一个结构,它可以帮助我知道收到的是 RandomNumber 消息。
它包含哪些类型?如果它在不同平台上也有不同长度的值,那么您可能会错误地解释这些值之后的数据。在你的结构声明中切换Message
和randomNumber
的顺序,看看是否有任何改变。
另外,作为一个健全性测试,您可以在sendRandomNumber
的末尾使用您最终得到的NSData*
,并在同一平台上将其传递给您读取数据的方法以确保这实际上是一个平台问题,而不是其他问题。以上是关于如何在 32 位和 64 位处理器 iOS 之间发送 int的主要内容,如果未能解决你的问题,请参考以下文章