在OS X 10.9.1上的Xcode 5.0.2中:
uint64_t data = 0x6ffa9e58938d7f5d;
NSData *nsdataObj = [NSData dataWithBytes:&data length:8];
NSLog(@"%@", nsdataObj);
输出:
<5d7f8d93 589efa6f>
如何/为什么数据会反转?
答案 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解决了这个问题。