为什么在wav文件头中有0x4e0而不是0x0?

时间:2012-12-30 18:58:43

标签: c wav binaryfiles

我有一个名为“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字节也是如此)。有什么问题?

2 个答案:

答案 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);