2017-04-01 66 views
0

我想從文件中讀取一些字節。反轉內存空間的方向?

這是我做了什麼:

struct HeaderData { 
    char format[2]; 
    char n_trks[2]; 
    char division[2]; 
}; 

HeaderData* header = new HeaderData; 

然後,直接從文件中獲取的數據header我做

file.read(reinterpret_cast<char*>(header), sizeof(HeaderData)) 

如果前兩個字節是00 06header->format[0]會是00header->format[1]06。合併的這兩個數字代表數字0x0006,它是十進制的6,這是所需的值。

當我這樣做

*reinterpret_cast<unsigned*>(header->format) // In this case, the result is 0x0600 

它錯誤地返回數字0x0600,所以它似乎反轉字節的讀取。

我的問題是什麼是一些解決方法,正確讀取數字爲無符號。

+1

你是否依賴關於大端存儲與小端存儲整數形式的(可能是錯誤的)體系結構? –

+1

'* reinterpret_cast (header-> format)'無論如何都是未定義的行爲。你應該在你的結構中使用'unsigned char',然後16位整型值是'format [0] * 256 + format [1];'。 –

+1

我認爲這是明確定義的行爲,因爲char *和unsigned *可能在法律上是別名。 – Puppy

回答

1

這將是一個排序不匹配。

當你從以那種方式讀取該文件,字節將被放置到您的結構,他們在該文件中的確切順序。

當你從結構看與unsigned,處理器將以體系結構要求它執行的任何順序解釋這些字節(大多數是硬編碼的,但有些可以設置爲任一順序)。

,或者換一種說法

這兩個數字組合代表這是十進制6數量0x0006。

這不一定是遠程真實的。你所選擇的處理器完全可以用十進制表示爲0x06 0x00,這將是在x86等非常常見的處理器上使用的小端方案。將其表示爲0x00 0x06將是big-endian。

正如M.M在他的評論中所說的,如果你的格式明確地定義了整數是小端,你應該明確地把它看作小端,例如, format[0] + format[1] * 256,或者如果它被定義爲big-endian,則應該將其讀爲format[0] * 256 + format[1]。不要依賴處理器的字節順序來匹配數據的字節順序。

+0

我知道在這種情況下0x0006是6,我忘了補充它,我已經編輯它。 – Garmekain

+0

你顯然不知道這樣的事情,因爲你的處理器似乎認爲0x00 0x06是0x600。 – Puppy

+0

我讀了midi的文檔,並在開始時定義了一個頭文件,其中有一些字節,後面跟着一個代表6的00 06字節序列,所以我事先就知道了;逐字節讀取給我正確的答案。我不知道的是我電腦的尾巴。 – Garmekain