解码 WAV 文件 Header

Decoding a WAV File Header

我正在尝试了解 WAV 文件的 header。我打开了一个示例文件并得到了这个:

5249 4646 e857 1400 5741 5645 666d 7420
1000 0000 0100 0200 44ac 0000 10b1 0200
0400 1000

我一直在阅读 this data representation tutorial

我理解52是一个字节,代表ASCII字母R。我最多理解1000 0000。为什么它代表十进制 16?教程说那个位置的值总是 0x101000 0000 如何等同于 0x10

此外,在读取文件时,程序是否知道需要数字还是 ASCII?大概它会检查一个已经在十六进制中的值?

谢谢

希望这能有所帮助,我将提及所有内容只是为了清楚:

一般用于十六进制的东西:我使用十六进制编辑器,dhex,你应该可以apt-getyum,或 brew 安装在你最喜欢的类 unix 机器上。我将使用 this site 作为大部分内容的来源 material:

正如您提到的,十六进制的前 4 个字节代表 ASCII 字符。在这种情况下,这些字符区域总是:

52 49 46 46 - RIFF

接下来的4个字节代表chunk的大小,是little endian。在你的情况下是:

e8 57 14 00 - 1333224

接下来的8个字节再次表示ASCII字符。你的情况:

57 41 56 45 - WAVE
66 6d 74 20 - fmt.

后面的4个代表chunk大小,是little endian:

10 00 00 00 - 268435456

这个chuck不代表十进制的16,它代表16位的十进制268435456(4字节1字节为4位)。由于 "why" 块是 16 位的原因,您可以在 Intro to Audio Programing 上阅读更多内容。这描述了数据部分中的块将是16位。

01 00代表音频格式(little endian),本例中1代表PCI。 02 00表示通道数,在你的例子中是2。

接下来的 4 个字节表示采样率(小端),或

The number of samples ( frames) that exist for each second of data. This field is represented in Hz. - taken from here.

44 ac 00 00 - 44100

接下来的4个字节代表字节率(little endian):

10 b1 02 00 - 1049265

接下来的2个字节表示块对齐:

This is the number of bytes in a frame (little endian). This is calculated by multiplying the number of channels by the number of bytes (not bits) in a sample. You can find more detailed calculations here

04 00 - 4 

接下来是你的 2 个字节,代表每个样本的位数(小端),在你的例子中是 16

10 00 - 16

数据部分:

您的 .wav 文件中目前没有数据部分,为了开始数据部分,您首先要为 data 编写 ASCII 值,如下所示(大端):

64 61 74 61 - data

在此之后,您需要 4 个字节来表示您的块 2 的大小,您应该可以开始了。在测试方面,我建议阅读 this guide if you have not already. I would also recommenced reading this post about how to build raw wav files Digital Audio - Creating a WAV (RIFF) file ,这也应该有助于理解如何 "decode" 它们。