解码WAV文件头

时间:2015-05-01 18:35:29

标签: hex wav

我试图理解WAV文件的标题。我打开了一个示例文件并得到了这个:

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?据推测,它会检查已经在HEX中的值吗?

由于

1 个答案:

答案 0 :(得分:10)

希望这有点帮助,我会提到一切只是为了清除:

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

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

brew

接下来的4个字节表示块大小,这是小端。在你的情况下它是:

52 49 46 46 - RIFF

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

e8 57 14 00 - 1333224

接下来的4代表块大小,这是小端:

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

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

10 00 00 00 - 268435456 表示音频格式(小端),1表示此情况下的PCI。 01 00表示频道数,在您的情况下为2。

接下来的4个字节表示采样率(little endian)或

  

每秒数据存在的样本数(帧数)。该字段以Hz表示。 - 取自here

02 00

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

44 ac 00 00 - 44100

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

  

这是帧中的字节数(小端)。这是通过将通道数乘以样本中的字节数(而不是位数)来计算的。您可以找到更详细的计算here

10 b1 02 00 - 1049265

接下来是您的2个字节,表示每个样本的位数(小端),在您的情况下为16

04 00 - 4 

数据部分:

您的10 00 - 16 文件中目前没有数据部分,为了启动数据部分,您首先要编写.wav的ASCII值,如此(big endian):

data

在此之后你需要4个字节代表你的chunk 2大小,你应该很高兴。在测试方面,如果您还没有,我建议您阅读this guide。我还会重新阅读这篇关于如何构建原始wav文件的帖子Digital Audio - Creating a WAV (RIFF) file ,这也应该有助于理解如何解码"它们。