0

只是出于好奇,同时学习波形文件格式和 C++,我偶然发现了这个页面,详细介绍了波形格式的规范布局

现在,我尝试编写一个 C++ 程序来读取采样率

char buffer[4];
// already read other values before reading sample rate
inFile.read(buffer, 4);
// conversion using little endian
sampleRate = (long) buffer[0] + ((long) buffer[1] << 8) + ((long) buffer[2] << 16) + ((long) buffer[3] << 24);

在十六进制编辑器中,我可以看到我的样本波形文件的采样率为44 ac 00 00,转换为 44100 速率。但是,使用上面的代码,我总是以 -21436 结尾

经过一些调试,原来的十六进制值“ac”应该在 dec 中转换为 172,但 C++ 假定十六进制值是“ffffffac”,在 dec 中转换为 -84。如果 C++ 只是假设它是简单的“ac”,那么我最终会得到正确的采样率值。

所以问题是,我如何从波形文件中读取数据并实际获得正确的采样率?我必须做一些魔术来去除前导的“f”吗?

提前致谢!

4

2 回答 2

3

最简单的方法如下:

// simply store bytes directly into sampleRate
long sampleRate = 0;
inFile.read(&sampleRate, 4);

正如您可能怀疑的那样,这假设您的系统是小端序。要修复您的示例,您必须避免在转换为 long 时发生的符号扩展。声明buffer类型unsigned char。请参阅以下内容。

unsigned char buffer[4];
inFile.read(buffer, 4);
long sampleRate = (long)buffer[0] + ((long)buffer[1] << 8) + ((long)buffer[2] << 16) + ((long)buffer[3] << 24);
于 2012-12-05T01:33:21.203 回答
1

有两种方法可以修复您的代码。首先是通过使所有内容都无符号来确保始终使用无符号算术。第二种是使用位掩码来删除符号扩展。

sampleRate = ((long) buffer[0] & 0xff) + (((long) buffer[1] << 8) & 0xff00) + (((long) buffer[2] << 16) & 0xff0000) + ((long) buffer[3] << 24);
于 2012-12-05T01:35:43.187 回答