2016-06-17 72 views
1

最近我(再次)讀到'endian'ness。我知道如何識別主機的排列順序,因爲在SO上有很多帖子,並且我也看到了this,我認爲這是相當不錯的資源。檢測二進制文件數據的字節順序

但是,我想知道的一件事是如何檢測輸入二進制文件的字節順序。例如,我讀的二進制文件(使用C++)像以下:

ifstream mydata("mydata.raw", ios::binary); 

short value; 
char buf[sizeof(short)]; 
int dataCount = 0; 

short myDataMat[DATA_DIMENSION][DATA_DIMENSION]; 
while (mydata.read(reinterpret_cast<char*>(&buf), sizeof(buf))) 
{ 
    memcpy(&value, buf, sizeof(value)); 
    myDataMat[dataCount/DATA_DIMENSION][dataCount%DATA_DIMENSION] = value; 
    dataCount++; 
} 

我想知道我怎麼可以檢測mydata.raw的存儲方式,以及是否字節順序反正影響此程序。

附加信息:

  • 我使用的數學運算只操縱數據myDataMat,並沒有指針操作或按位運算對數據進行)。
  • 我的機器(主機)是小端。
+1

你不能*檢測二進制文件的字節順序。在將數據寫入文件和使用'ntohs'等時,只需使用'htons'等 –

+0

簡而言之:您不能。 –

+1

*我想知道如何檢測字節序列... *您無法檢測*它。文件本身包含一些它所使用的排列順序的指示,或者你運氣不佳。如果你讀了'0x2a00',你不能確定它是'42'(小端)還是'10752'(大端)。 –

回答

3

無法「檢測」數據的一般性。就像不可能檢測到數據是4字節整數的數組還是兩倍多的2字節整數一樣。在沒有任何有關表示的知識的情況下,原始數據只是一大堆毫無意義的部分。

但是,藉助關於數據表示的一些額外知識,它變得可能。一些例子:

  • 大多數文件格式要求特定的endianity,在這種情況下,這從來都不是問題。
  • Unicode文本文件可以選擇以byte order mark開頭。同樣的想法可以通過其他數據表示來實現。
  • 某些文件格式包含checksum。您可以猜測一個endianity,如果校驗和不匹配,請再次嘗試使用另一個endianity。校驗和不太可能與數據的錯誤解釋相匹配。
  • 有時您可以根據數據進行猜測。 33'554'432度外的溫度,或者2?你可以選擇代表理智數據的代碼。當然,當外星人入侵併開始融化我們的星球時,這種猜測失敗了。
3

你不能說。

字節序轉換本質上是一個數字x上的算子E(x),使得x = E(E(x))。所以你不知道你的文件中「x元素在哪個方向」。