如何在 DataView 中设置带符号的 24 位整数?
How to set a signed 24-bit integer in a DataView?
我找到了 this,但它适用于无符号 24 位整数:
DataView.prototype.setUint24 = function(pos, val) {
this.setUint16(pos, val >> 8);
this.setUint8(pos+2, val & ~4294967040); // this "magic number" masks off the first 16 bits
}
简单地将 setUint16
更改为 setInt16
并将 setUint8
更改为 setInt8
似乎不起作用。我对低级二进制内容的了解非常有限,所以我需要一些帮助。我了解大部分功能:
val >> 8
只保留前 16 位存储为 16 位
pos + 2
是因为 16 位整数在 space 方面占用 2 个字节
- 至于
val & ~4294967040
,嗯,有评论哈哈。
我不太确定为什么仅仅更改对设置有符号值的方法的调用不起作用/我不太确定为什么在设置 signed/unsigned 值时过程不同。
正如@Ryan 和@Thomas 所评论的那样,此方法有效。我认为它不起作用,因为我创建的 wav 文件是纯白噪声。事实证明,虽然此方法有效,但它可能以错误的顺序设置字节(这对 wav 文件有问题,但对其他处理没有问题)。有关详细信息,请参阅 。
我找到了 this,但它适用于无符号 24 位整数:
DataView.prototype.setUint24 = function(pos, val) {
this.setUint16(pos, val >> 8);
this.setUint8(pos+2, val & ~4294967040); // this "magic number" masks off the first 16 bits
}
简单地将 setUint16
更改为 setInt16
并将 setUint8
更改为 setInt8
似乎不起作用。我对低级二进制内容的了解非常有限,所以我需要一些帮助。我了解大部分功能:
val >> 8
只保留前 16 位存储为 16 位pos + 2
是因为 16 位整数在 space 方面占用 2 个字节
- 至于
val & ~4294967040
,嗯,有评论哈哈。
我不太确定为什么仅仅更改对设置有符号值的方法的调用不起作用/我不太确定为什么在设置 signed/unsigned 值时过程不同。
正如@Ryan 和@Thomas 所评论的那样,此方法有效。我认为它不起作用,因为我创建的 wav 文件是纯白噪声。事实证明,虽然此方法有效,但它可能以错误的顺序设置字节(这对 wav 文件有问题,但对其他处理没有问题)。有关详细信息,请参阅