2011-10-05 48 views
0

我正在構建一些讀取RIFF wav文件的代碼,並且碰到了一些奇怪的東西。包含二進制字符的字符數組中的字節序

前4個字節的文件頭部的是在大端 ASCII編碼字RIFF:

0x5249 0x4646 

予讀取使用此第一個元素:

char *fileID = new char[4]; 
filestream.read(fileID,4); 

當我寫這篩選結果如預期:

std::cout << fileID << std::endl; 
>> RIFF 

現在,接下來的4個字節給出了文件的大小,但關鍵是它們是little-endian

所以,我寫了一個小功能翻轉字節的基礎上,聯合:

int flip4bytes(char* input){ 

    union flip {int flip_int; char flip_char[4];}; 

    flip.flip_char[0] = input[3]; 
    flip.flip_char[1] = input[2]; 
    flip.flip_char[2] = input[1]; 
    flip.flip_char[3] = input[0]; 

    return flip.flip_int; 

} 

這對我來說很好,除非我叫它,返回的值是完全錯誤的。有趣的是,下面的代碼(其中字節逆轉!)正常工作:

int flip4bytes(char* input){ 

    union flip {int flip_int; char flip_char[4];}; 

    flip.flip_char[0] = input[0]; 
    flip.flip_char[1] = input[1]; 
    flip.flip_char[2] = input[2]; 
    flip.flip_char[3] = input[3]; 

    return flip.flip_int; 

} 

這已經徹底搞糊塗了。聯盟以某種方式顛倒了我的字節?!如果不是,那麼如何正確地將字節轉換爲int而不會被反轉?

我覺得有字節序的某些方面在這裏,我懵懂地..

+4

char-array不具有*的概念。它只是一個接一個的字節數組。字節序僅適用於比一個字節寬的類型,比如'int'。另外,你的意思是你的聯盟中有'char flip_char [4]'嗎? –

+0

我的確是,編輯來反映這一點。謝謝 – Speedy

回答

5

你只是一個小端機器上,而「RIFF」字符串只是一個字符串,因此也不小 - 也不是大端,而只是一串字符。您不需要在小端機器上反轉字節,但需要在大端機器上操作時。

2

你需要你的機器的endianess的數字。 #include <sys/param.h>將幫助你做到這一點。

你也可以使用網絡字節順序大的事實(如果我的內存正確地服務我 - 你需要檢查)。在這種情況下,轉換爲大結局並使用ntohs函數。這應該適用於您編譯代碼的任何機器。

相關問題