我正在尝试理解 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?教程说该位置的值始终为0x10
。 1000 0000
如何等同于 0x10
。
此外,在读取文件时,程序是否知道需要数字还是 ASCII?大概它会检查已经存在的十六进制值?
谢谢
最佳答案
希望这对您有所帮助,我将提及所有内容只是为了清楚起见:
一般用于十六进制的东西:我使用十六进制编辑器,dhex
,您应该能够apt-get
, yum
或 brew
安装在您最喜欢的类 UNIX 机器上。我将使用 this site 作为大部分 Material 的来源:
正如您所提到的,十六进制的前 4 个字节表示 ASCII 字符。在这种情况下,这些字符始终是:
52 49 46 46 - RIFF
接下来的 4 个字节表示 block 大小,为小端字节序。在你的情况下是:
e8 57 14 00 - 1333224
接下来的 8 个字节再次表示 ASCII 字符。对于您的情况:
57 41 56 45 - WAVE
66 6d 74 20 - fmt.
接下来的4位代表 block 大小,即小端:
10 00 00 00 - 268435456
这个卡盘不代表十进制16,它代表16位的十进制268435456(4个字节,1个字节为4位)。至于“为什么” block 是 16 位的原因,您可以阅读有关 Intro to Audio Programing 的更多内容。这说明数据部分中的 block 将为 16 位。
01 00
表示音频格式(小端),本例中 1 代表 PCI。 02 00
表示 channel 数,在您的情况下为 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 个字节表示字节率(小端):
10 b1 02 00 - 1049265
接下来的 2 个字节表示 block 对齐:
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 值,如下所示(big字节序):
64 61 74 61 - data
在此之后,您需要 4 个字节来表示您的 block 2 的大小,您应该可以开始了。在测试方面,如果您还没有阅读过,我建议您阅读 this guide。我还会重新开始阅读这篇关于如何构建原始 wav 文件 Digital Audio - Creating a WAV (RIFF) file 的文章,这也应该有助于理解如何“解码”它们。
关于hex - 解码 WAV 文件头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29992898/