在Xcode中5.0.2在OS X 10.9.1:NSData对象被反转
uint64_t data = 0x6ffa9e58938d7f5d;
NSData *nsdataObj = [NSData dataWithBytes:&data length:8];
NSLog(@"%@", nsdataObj);
输出:
<5d7f8d93 589efa6f>
如何/为什么数据获取逆转吗?
在Xcode中5.0.2在OS X 10.9.1:NSData对象被反转
uint64_t data = 0x6ffa9e58938d7f5d;
NSData *nsdataObj = [NSData dataWithBytes:&data length:8];
NSLog(@"%@", nsdataObj);
输出:
<5d7f8d93 589efa6f>
如何/为什么数据获取逆转吗?
因为Endianness显然。 (感谢@Hot Licks和@Josh Caswell!)通过使用Core Foundation字节顺序功能CFSwapInt64解决了问题。
在这个英特尔Macintoshes *这个勇敢的新世界中,您的整数以绝对bizzare的方式存储在内存中,被称为“little-endian字节顺序”。这意味着,与编写您的编号,最低有效字节或最低幅度字节的更合理,可读的格式不同,它们实际上已排序到数据的开头。 (在您的数据的情况下,最低有效位是0x5d
,然后是0x7f
,依此类推)。
这不会改变整数的值;如果您使用值作为整数,计算机知道如何适当地读回它。另一方面,NSData
只是将内存中的字节挖出,因此在打印时看到小尾序。
如果您需要在创建NSData
之前更改订单,使其更自然地按照Woz的意图订购 - 您可以使用相应的Foundation Byte Ordering function。
查看更多this Big Nerd Ranch article。
*好的,不再那么新了。
我怀疑“小端”顺序可以追溯到50年代和60年代初的一些十进制系统。 –
我的父亲喜欢抱怨那个小端是硬件工程师为了减轻他们自己的生活而做的选择,但是他一直在编写网络软件三十年。我只是继承了他的偏见,不时地享受一点夸张。 –
谷歌“小端”。 –