hex - 解码 WAV 文件头

标签 hex wav

我正在尝试理解 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-getyumbrew 安装在您最喜欢的类 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/

相关文章:

android - 如何在android中为wav文件添加回声效果?

python - 如何查找在线音频文件的持续时间而无需使用python下载?

audio - 识别击键的十六进制值

c++ - 状态机问题

python - Python 中的连接和重叠声音

java - Java 中的 AMR 到 WAV 转换器

Lua - 在 32 位 lua 编译器上处理 64 位数字

java - 在Java FX中将TextField输入限制为十六进制值

python - 如何在 Python 中将十六进制字符串与文字字符串进行异或?

ios - ios 中非常简单的波形合成器/表