我正在構建一些讀取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而不會被反轉?
我覺得有字節序的某些方面在這裏,我懵懂地..
char-array不具有*的概念。它只是一個接一個的字節數組。字節序僅適用於比一個字節寬的類型,比如'int'。另外,你的意思是你的聯盟中有'char flip_char [4]'嗎? –
我的確是,編輯來反映這一點。謝謝 – Speedy