【发布时间】:2011-10-05 10:22:32
【问题描述】:
我正在构建一些代码来读取 RIFF wav 文件,但遇到了一些奇怪的事情。
文件头的前4个字节是big-endian 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 而不会被反转?
我认为这里有一些我不知道的字节序的方面..
【问题讨论】:
-
一个字符数组没有有字节序的概念。它只是一个字节数组,一个接一个。字节序仅适用于大于一个字节的类型,例如
int。另外,你的意思是char flip_char[4]在你的工会里吗? -
我做了,经过编辑以反映这一点。谢谢
标签: c++ endianness