我有一个名为“file.wav”的wav文件,我想用C程序读取该文件的一些规范。我找到了wav文件here的结构。根据这个文档,在普通的wav文件中,AudioFormat字节应该是0x1和0x0,或者NumChannels字节应该是(如果是单声道)0x1和0x0;有许多类似的部分应该看起来像这些。
现在,我的C程序非常简单:我以二进制模式打开文件,我寻找AudioFormat部分(第20个字节),我读取两个字节,然后将它们放入缓冲区;然后我打印到stdin缓冲区内容。
#include <stdio.h>
main()
{
void *buf[2];
FILE *f;
f=fopen("file.wav", "rb");
fseek(f, 20, SEEK_SET);
fread(buf, 1, 2, f);
printf("example: %#hx %#hx\n", buf[0], buf[1]);
/*the '#' flag stands for the 0x[···] format output,
the 'h' says that the number is a short integer (2 bytes).*/
return 0;
}
我的问题是第二个字节而不是0x0总是0x4e0,这对于应该为0的每个字节(例如对于NumChannels或BitPerSamples字节也是如此)。有什么问题?
答案 0 :(得分:8)
如果你很幸运,你会在运行时遇到编译警告或崩溃。虽然我认为对于这个特殊情况你不会,但我不认为你在做什么实际上是未定义的行为。您的问题的核心是,当您声明:
void *buf[2];
您将 buf声明为指向void 的指针的数组2。当您访问buf[0]
时,您不是在阅读字节而是指针。可以说还有很多东西可以解释发生了什么,但我认为这对你想要做的事情已经足够了:
char buf[2];
答案 1 :(得分:1)
正如其他人所提到的,你正在阅读一个指针数组。
其次是音频格式字段是2个字节。
FILE *f;
short afmt;
if((f = fopen("file.wav", "rb")) == NULL)
err(1, "fopen");
fseek(f, 20, SEEK_SET);
fread(&afmt, sizeof(short), 1, f);
printf("audio format: 0x%hx\n", afmt);
fclose(f);