2012-07-16 81 views
2

在過去的幾個小時裏,我一直在敲打我的腦袋,這似乎是一件非常簡單的任務。NSInteger以相反的順序排列到字節數組

我的應用程序通過tcpip與服務器進行通信。該協議要求每個請求的前4個字節是流的長度,以相反的順序。例如,如果長度爲13,我需要提供(小數){0,0,0,13};如果它是300,我需要提供{0,0,44,256}。然後,實際數據如下。顯然這是在Java和VB中(如BitConverter.GetBytes(sendString.Length).Reverse()。ToArray())做的非常簡單的事情。但在obj-c中,我只是無法使它工作,我試過NSString/NSData/NSArray之間的各種轉換,沒有運氣。

在此先感謝!

+1

咦? {0,0,44,256}不是有效的字節序列(因爲256不是有效的字節值)。你只是在網絡順序(又名big-endian)寫一個整數? – 2012-07-16 21:59:30

+0

可能的重複[如何在objective-c中反轉NSInteger或NSUInteger的字節順序](http://stackoverflow.com/questions/3830862/how-can-i-reverse-the-byte-order-of -an-nsinteger-or-nsuinteger-in-objective-c) – Caleb 2012-07-16 21:59:48

+0

@Adam是的,它似乎應該被寫爲「{0,0,1,44}」,是否正確?除非我錯過了一些東西。然後再次,這個問題似乎指定使用一些奇怪的字節順序,所以也許'{44,1,0,0}'或'{0,0,44,1}'? – 2012-07-16 22:01:18

回答

6

服務器以big-endian順序請求數據(最重要的字節在前)。 Big-endian是互聯網協議(包括IP,TCP,UDP,DNS等等)的標準網絡字節順序。碰巧你正在編譯一個小端平臺,所以你需要交換字節。

但是,你不應該依靠在一個小端平臺上。相反,您應該使用Core Foundation byte-swapping functions使本地(主機)字節順序的代碼獨立

具體來說,您應該使用CFSwapInt32HostToBig將您的4字節int轉換爲big-endian順序。在小端平臺上,這將重新排列字節。在一個大端平臺上,這沒有任何作用。

同樣,您應該使用CFSwapInt32BigToHost將您從服務器收到的4字節整數轉換爲您的主機字節順序。

或者,您可以使用standard POSIX byte-swapping functionshtonl函數代表host-to-network-long,並將32位int從主機順序轉換爲網絡(big-endian)順序。 ntohl函數將32位int從網絡轉換爲主機順序。 (當這些功能被創建時,一些流行的操作系統有16位整數和32位長整數,你能相信嗎?)

+0

感謝羅布。我昨天剛寫完即使我看到[this](http://stackoverflow.com/questions/3830862/how-can-i-reverse-the-byte-order-of-an-nsinteger- or-nsuinteger-in-objective-c)之前,我非常確定這不是一個排序的情況,因爲我的crc有4個字節(而且我沒有意識到Int32就是這樣)。我想我正在做的是採取一種工程方法(將int轉換爲字節數組,交換字節,將結果轉換爲nsdata)...並且錯過了非常明顯的,爲此我現在覺得很愚蠢:)短篇小說:再次感謝,經驗教訓。 – lucianf 2012-07-17 10:56:17

0

如重複問題的接受答案所示,Foundation爲字節交換提供了函數。在這種情況下,由於您處理的時間很長,您可能需要NSSwapLong

1
NSInteger a = 300; //13; 
char* aa = &a; 
Byte b[] = {0,0,0,0}; 
memcpy(&b[0], &aa[3], 1); 
memcpy(&b[1], &aa[2], 1); 
memcpy(&b[2], &aa[1], 1); 
memcpy(&b[3], &aa[0], 1); 
+0

謝謝Jaspreet,那會是上面提到的工程方法:) – lucianf 2012-07-17 10:58:28