2013-03-08 18 views
1

我有一個NSData,我想將其長度作爲十六進制數字附加在其標題中。我能夠做到這一點使用下面的代碼:從上面的len = 5碼iOS:如何將NSData的長度添加爲其兩個字節的標題?

unsigned int len = [data length]; 

NSMutableData *sendData = [[NSMutableData alloc] initWithBytes:&len length:2]; 
[sendData appendData:data]; 

結果是「05 00」,但我希望「00 05」代替。有誰知道這是怎麼做到的嗎?

頭總是將是長度2。

致謝,

+0

這很可能與字節序的事,試着去'無符號int len = CFSwapInt16BigToHost([data length]);' – 2013-03-08 21:45:15

+0

在http://www.gamedev.net/page/resources/_/technical/game-programming/writing-endian-independent-code有一篇文章提到了endian swapping -in-c-r2091 – 2013-03-08 21:46:54

+2

@Scott不應該是'CFSwapInt16HostToBig'嗎?目標是從當前的「主機」端節點到所需的大端節點。 – rmaddy 2013-03-09 00:56:55

回答

2

下面addumes的代碼(如你做的),該長度小於65536(兩個字節)。所以,你需要使用:

uint16_t len = CFSwapInt16HostToBig([data length]); 
NSMutableData *sendData = [[NSMutableData alloc] initWithBytes:&len length:2]; 
[sendData appendData:data]; 

可用功能的列表中去文件在下面的蘋果開發者庫描述:

Byte-Order Utilities Reference

+3

你的交換是倒退的。你想從'host'轉到big endian。 'Host'總是代表你在當前設備上擁有的東西。您還應該首先將原始長度分配給'uint16_t'變量,然後交換該變量。 – rmaddy 2013-03-09 00:53:40

+2

我的錯誤。大多數時候我需要做相反的事情,所以在閱讀全文之前,我接受了Xcode中的自動完成...感謝您看到它。 – Jean 2013-03-09 12:17:36

+1

完美。謝謝 – m4singh 2013-03-11 13:13:35