从无符号的64位整数创建的NSData对象是相反的

时间:2014-02-09 20:13:02

标签: objective-c nsdata

在OS X 10.9.1上的Xcode 5.0.2中:

uint64_t data = 0x6ffa9e58938d7f5d;
NSData *nsdataObj = [NSData dataWithBytes:&data length:8];
NSLog(@"%@", nsdataObj);

输出:

<5d7f8d93 589efa6f>

如何/为什么数据会反转?

2 个答案:

答案 0 :(得分:6)

在这个英特尔Macintoshes *的勇敢新世界中,你的整数以一种绝对古怪的方式存储在内存中,称为“小端字节顺序”。这意味着,与您编写数字的更合理,人类可读的格式不同,最低有效字节或最低量级的字节实际上被排序到数据的开头。 (对于您的数据,LSB为0x5d,后跟0x7f,依此类推。)

这不会改变整数的值;如果您将值用作整数,则计算机知道如何正确读取它。另一方面,NSData只是在字节存储时将字节挖出来,因此在打印时会看到小端顺序。

如果您需要在创建NSData之前更改顺序,以更自然的大端顺序 - 正如Woz所预期的那样 - 您可以使用相应的Foundation Byte Ordering function

查看this Big Nerd Ranch article了解更多信息。


*好的,不再那么新了。

答案 1 :(得分:0)

因为显然Endianness。 (感谢@Hot Licks@Josh Caswell!)使用Core Foundation字节顺序函数CFSwapInt64解决了这个问题。