如何检测字节序以保持与iOS一致的字节顺序

3

我在处理iOS字节顺序时遇到了问题。我们通过BLE发送消息,其中一些值存储为NSInteger对象。

我的旧款(但仍受支持的)iPad似乎使用大端字节顺序存储整数,这是我们外围设备正确解释该值所必需的,然而当我在新款iPhone上运行相同的应用程序时它不起作用,并且字节顺序被反转了。

NSInteger number = 230; /* this is actually declared elsewhere, this is just for the example */

short value = (short)number;

NSData* data = [NSData dataWithBytes:(void*)&value length:sizeof(value)];

int intData = [self intFromNSData:data];

传入的结果值是:

On iPad: 230 (00E6)
On iPhone: 58880 (E600)

如您所见,两个设备的字节顺序不同,我想知道如何在将它们发送到外围设备之前检测并(如果需要)交换字节。或者是否有一种不同的方式来存储这些数字,以确保在所有设备上都始终一致?

1个回答

4

您不需要检测运行您的应用程序的设备的字节序。为了确保您始终发送大端字节,请使用适当的 NSSwapHostXXXToBig 函数。

short value = 230;
short beValue = NSSwapHostShortToBig(value);
NSData *data = ...

或者您可以使用CFSwapXXXHostToBig函数。这些函数适用于各种固定大小的数据类型,例如uint16_t

uint16_t value = 230;
uint16_t beValue = CGSwapInt16HostToBig(value);
NSData *data = ...

如果需要,每个函数都有相应的功能,将大端值转换回适当的主机值。


我认为这是一个打字错误,第二个例子应该使用CF前缀而不是CG。我无法编辑它,因为必须至少更改6个字符。 - vpoltave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接