Wave File 原始数据 16bits 样本值

Wave File raw data 16bits Sample values

我正在尝试生成一个图表来展示波形文件的振幅。

我已经读取文件字节,然后通过小端转换为十六进制,然后将值转换为十进制。

但即使声音是16位,因此值应该在(-32768, 32768)之间,但我得到的十进制值超过了这个值,达到了65000;

一个例子可能会更好地解释我的情况:

来自文件的字节:(121, -2) 自单声道以来取两个值,即 numChannels = 1,因此 blockAlign = 2

小端值:87 FE

十六进制值(大端):FE87

十进制:65159

我什至考虑将 Hex 设为 -FE87,因为该字节具有负值,但我认为它们不能那样工作。

我认为这句话是罪魁祸首,但我无法弄清楚。 “16 位样本存储为 2 的补码有符号整数,范围从 -32768 到 32767。” http://soundfile.sapp.org/doc/WaveFormat/

谁能帮我解决我做错的地方,我花了好几个小时才弄明白。

在二进制补码中(顺便说一下,Java 原生使用),数字的符号由最左边的位决定。

当您解析该十六进制值 FE87 并将结果存储在 int 中时,最左边的位为零,因此结果为正数。

你想要做的是砍掉除 16 个最低有效位以外的所有位。您可以通过将 int 转换为 short 来做到这一点。现在short最左边的位是1,表示数字是负数。

int i = Integer.parseInt("FE87", 16);
System.out.println(i);
short sample = (short) i;
System.out.println(sample);

输出:

65159
-377