为什么读取小端存储的WAV文件整数字段无需调整字节序即可得到正确结果?
核心原因
你运行代码的CPU本身采用小端(Little Endian)字节序,和WAV RIFF头部规定的数值存储字节序完全一致,因此不需要额外做字节重排就能得到正确数值。
详细说明
我们日常使用的绝大多数消费级PC、服务器的CPU都是x86或x86_64架构,这类架构默认采用小端字节序:即数值的低位字节存储在内存低地址,高位字节存储在内存高地址,刚好和WAV规范里定义的头部数值存储规则匹配。你通过read直接把4个字节的内容拷贝到int类型变量的内存空间时,内存里的字节排布刚好符合CPU解析int类型的规则,直接输出自然就能得到正确结果。

注意事项
这种写法不具备跨平台兼容性:
- 如果你把代码跑在大端(Big Endian)架构的设备上(比如部分ARM架构设备、PowerPC、MIPS平台等),输出的数值就会完全错误,必须先做字节序转换才能得到正确结果
- 更稳妥的跨平台写法是手动拼接4个字节得到数值,或者调用对应平台的小端转主机字节序函数(比如POSIX平台的
le32toh、Windows平台的LittleEndianToHost32)来保证兼容性。
你给出的测试代码逻辑如下:
std::ifstream file(p, std::ios::binary); // RIFF header char riff[5]{}; riff[4] = '\0'; // null terminator for cout // size of the file minus 8 bytes int size_of_file; // wave char wave[5]{}; wave[4] = '\0'; file.read(riff, 4); file.read(reinterpret_cast<char *>(&size_of_file), 4); file.read(wave, 4); std::cout << riff << std::endl; // prints RIFF std::cout << size_of_file << std::endl; // prints the correct number (how?) std::cout << wave << std::endl; // prints WAVE
内容的提问来源于stack exchange,提问作者Omar Walid
相关产品推荐
相关产品推荐

