解码 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?教程说那个位置的值总是 0x10
。 1000 0000
如何等同于 0x10
。
此外,在读取文件时,程序是否知道需要数字还是 ASCII?大概它会检查一个已经在十六进制中的值?
谢谢
希望这能有所帮助,我将提及所有内容只是为了清楚:
一般用于十六进制的东西:我使用十六进制编辑器,dhex
,你应该可以apt-get
,yum
,或 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" 它们。
我正在尝试了解 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个字节代表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" 它们。