我试图理解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?该教程说该位置的值始终为0x10
。 1000 0000
如何等同于0x10
。
此外,在阅读文件时,程序是否会知道是否需要数字或ASCII?据推测,它会检查已经在HEX中的值吗?
由于
答案 0 :(得分:10)
希望这有点帮助,我会提到一切只是为了清除:
一般用于十六进制的东西:我使用十六进制编辑器dhex
,您应该可以apt-get
,yum
或{ {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 ,这也应该有助于理解如何解码"它们。