2013-11-25 100 views
1

我有這樣一段代碼的NSArray和字節順序

NSMutableData *mData = [NSMutableData data]; 

uint16_t bytes = 0x9F21; 
[mData appendBytes:&bytes length:sizeof(bytes)]; 

當我打印帶有P/XI字節得到

0x9F21 

,如果我嘗試PO MDATA我得到

<219f> 

這是一個有關字節順序的問題,我看到如果我轉換字節的順序,mData正確存儲字節

如果我打印使用此代碼我得到的預期值

NSMutableData *mData = [NSMutableData data]; 

uint16_t bytes = CFSwapInt16HostToBig(0x9F21); 
[mData appendBytes:&bytes length:sizeof(bytes)]; 

這是MDATA對象是指對appendBytes需要兩個小和大端archs大端排序?

回答

0

appendBytes將按照它們在您提供給方法的緩衝區指針內的順序接收字節。它不需要也不需要任何特定的endiannes命令。

你必須根據你想要在NSData中的字節順序來轉換你的int「endianness」。或者,如果您只對字節感興趣並直接存儲字節,則不要使用int_16。如果不知道要存儲的數據,很難提供更多建議。

1

你不會說你想要對數據做什麼,但是隻有在從/向外部媒體讀/寫數據時才應該轉換endian,比如網絡連接和數據末端定義明確的文件。這個過程被稱爲marshalling。您需要將數據保持爲本地形式,實際上將其視爲大端(即執行類似bytes >> 8的操作將產生0x9f)。

當我打印帶有P/XI字節得到

0x9F21 

正在打印在本機格式的16位無符號整數(LLDB知道這是一個16位的類型)

,如果我嘗試PO MDATA我得到

<219f> 

這就是打印一個字節流,因爲這是NSData對象的性質。它揭示了你的本地架構是小端,但這不應該是重要的。