2013-05-20 31 views
0

我將數據字節存儲在數組中。現在,在我使用getBytes的程序中:range:NSmakeRange(position,length)。當我打印我收到的字節時,我認爲他們的位置已經交換,我的回答是0x0292而不是0x9202(請查看我的程序)。是否有必要在Objective-c中交換此場景中的字節?

現在,我很困惑哪一個是正確的答案。我真的有必要總是交換我收到的字節。請向我解釋這個概念,以便我可以清楚地理解。

這是我的代碼!謝謝。

const Byte dataBytesArray[] = { 
    0x92, 0x02, 0x13, 0x14 //in Hex 
}; 

NSData *myDataArray = [[NSData alloc]initWithBytes:dataBytesArray length:4]; 
uint16_t ef; 
[myDataArray getBytes:&ef range:NSMakeRange(0, 2)]; 

NSLog(@"dataByteArray is %@ ",[NSNumber numberWithUnsignedInteger:ef]);//the answer I got is 658 in decimal format which is 0x0292 

uint16_t swapping = CFSwapInt16BigToHost(ef); //swapping the bytes 
NSLog(@"swap is %@ ",[NSNumber numberWithUnsignedInteger:swapping]); //after swapping I got 37378 which is 0x9202 

回答

1

無論您是使用像CFSwapInt16BigToHost功能取決於你正在處理什麼用兩端。

如果您的「主機」(運行此代碼的計算機)可能會有所不同,那麼使用衆多功能之一是一個非常好的主意。例如,Intel Mac和ARM iOS設備使用不同的字節排序。 PowerPC Mac和Intel Mac使用不同的字節順序(我認爲這是真的)。爲了讓您的代碼在這些不同的環境中安全運行,使用適當的「toHost」函數是明智的。

即使您的代碼目前只能在一種設備上運行,使用這些代碼仍然是明智的選擇,以避免主機正確順序的混淆。

所以關鍵的決定是知道在接收的數據中使用了什麼字節排序。如果您知道接收到的數據是以big-endian字節順序的事實,那麼請使用適當的「BigToHost」函數。如果您知道收到的數據是小尾數再見順序,那麼請使用適當的「LittleToHost」函數。如果你不知道,那麼你必須找出答案。

要考慮的另一件事是從您的應用程序發送數據。您應該使用適當的「HostTo」功能。例如,這在iOS應用中非常重要。您的iOS應用程序可以在ARM iOS設備上運行,也可以在Intel Mac上的模擬器上運行。如果你只是發送主機字節,那麼順序將根據應用程序的運行位置而變化。這不好。所以應用程序應該選擇一個訂單,然後使用適當的「HostTo」函數將數據轉換爲所選順序。然後,任何需要讀取該數據的代碼都可以在使用「ToHost」函數時指定相同的順序。

+0

嗨,謝謝你以前的回答。我也使用了CFByteOrderGetCurrent(),並且知道我的機器正在使用Little Endian Format。所以,當我從使用MSB到LSB數據格式的傳感器設備接收數據時,我需要在我的IOS中使用CFSwap ... BigToHost對嗎?由於我的機器使用Little Endian格式! – Raj0689

+1

如果傳感器的數據是big-endian,那麼是的,您必須使用'CFSwap ... BigtoHost'。這將允許您的iOS應用程序在真實iOS設備上運行時以及在模擬器中運行時正常工作。 – rmaddy

0

這都是關於排序的。如果你從網絡上收到你的數據,它將是大端。你的機器是小端的,所以在這種情況下你需要交換字節。

參見:http://en.wikipedia.org/wiki/Endianness

+0

您的一般性陳述可能會也可能不會。僅僅因爲數據來自網絡並不意味着數據就是大數據。而「你的機器」可能會或可能不是小端。這取決於機器。英特爾Mac是一種方式,而ARM iOS設備則是另一種方式。 – rmaddy

+0

@rmaddy你是對的,答案很一般。但他所遇到的問題與排序有關。下次我會更加精確。 – Markus

相關問題