0

我有一个名为“file.wav”的 wav 文件,我想用 C 程序读取文件的一些规范。我在这里找到了 wav 文件的结构。根据这个文档,在普通的 wav 文件中,AudioFormat 字节应该是 0x1 和 0x0,或者 NumChannels 字节应该是(如果是单声道)0x1 和 0x0;有很多类似的部分应该看起来像这样。

现在,我的 C 程序非常简单:我以二进制模式打开文件,寻找 AudioFormat 部分(第 20 个字节),读取两个字节并将它们放入缓冲区;然后我打印到标准输入缓冲区内容。

#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 字节)。问题是什么?

4

2 回答 2

8

如果幸运的话,您会在运行时收到编译警告或崩溃。尽管我认为对于这种特殊情况您不会,但我认为您所做的实际上并不是undefined behavior。你的问题的核心是当你声明这个时:

void *buf[2];

您将buf 声明为指向 void 的指针的数组 2。当您访问时,buf[0]您不是在读取字节,而是在读取指针。可以说更多来解释正在发生的事情,但我认为这对于您正在尝试做的事情已经足够了:

char buf[2];
于 2012-12-30T19:02:12.577 回答
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);
于 2012-12-30T19:18:43.323 回答