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

时间:2016-08-25 19:39:49

标签: ios objective-c iphone ipad endianness

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

我有一个较旧(但仍然支持)的iPad似乎存储了具有big-endian字节顺序的整数,这是我们的外设正确解释该值所必需的,但是当我在较新的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 个答案:

答案 0 :(得分:4)

您无需检测运行应用的设备的字节顺序。要确保始终将字节作为big-endian发送,请使用相应的NSSwapHostXXXToBig函数。

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

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

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

如果需要,每个都有相应的函数将big-endian值转换回适当的主机值。