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

Fed*_*tta 0 c binaryfiles wav

我有一个名为"file.wav"的wav文件,我想用C程序读取该文件的一些规范.我在这里找到了wav文件的结构.根据这个文档,在普通的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;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是第二个字节而不是0x0总是0x4e0,这对于每个应该为0的字节(例如对于NumChannels或BitPerSamples字节也是如此).问题是什么?

K-b*_*llo 8

如果你很幸运,你会在运行时遇到编译警告或崩溃.虽然我认为对于这种特殊情况你不会,我不认为你在做什么实际上是未定义的行为.您的问题的核心是,当您声明:

void *buf[2];
Run Code Online (Sandbox Code Playgroud)

你将buf声明为指向void的数组2.当你访问时,buf[0]你不是读取字节而是指针.可以说还有很多东西可以解释发生了什么,但我认为这对你要做的事情已经足够了:

char buf[2];
Run Code Online (Sandbox Code Playgroud)