在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年代初的一些十進制系統。 –
我的父親喜歡抱怨那個小端是硬件工程師爲了減輕他們自己的生活而做的選擇,但是他一直在編寫網絡軟件三十年。我只是繼承了他的偏見,不時地享受一點誇張。 –
谷歌「小端」。 –