【问题标题】:How to set a signed 24-bit integer in a DataView?如何在 DataView 中设置有符号的 24 位整数?
【发布时间】:2017-02-14 01:07:43
【问题描述】:

我找到了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 更改为setInt16setUint8 更改为setInt8 似乎不起作用。我对低级二进制内容的了解非常有限,所以我需要一些帮助。我了解这个功能的大部分内容:

  • val >> 8 只保留前 16 位存储为 16 位
  • pos + 2 是因为 16 位整数占用 2 个字节空间
  • 至于val & ~4294967040,嗯,有评论哈哈。

我不太确定为什么只更改对设置有符号值的方法的调用不起作用/我不太确定为什么在设置有符号/无符号值时过程会有所不同。

【问题讨论】:

  • val & ~4294967040 很傻; val & 0xff 会更具可读性。无论如何,setUint24 应该适用于没有变化的有符号整数。
  • @Ryan 我至少需要使用setInt16 setInt8 而不是他们的“未签名”替代方案,对吗?我想我的代码还有其他问题......
  • 不,它应该在没有任何变化的情况下工作。
  • 所以我想设置一个有符号的 24 位整数,但是使用方法来设置一个无符号的 16 和 8 整数有效吗?我很困惑,但在你回复之前我已经很困惑了,所以我想这不会改变任何事情。
  • JavaScript 的整数类型是 32 位有符号和无符号整数...... ish。从位运算符得到的任何东西都是 32 位整数。结果由除>>> 之外的每个运算符签名,这会产生无符号结果。如果将有符号的 32 位整数视为无符号的 32 位整数并将其屏蔽为 24 位,则结果与将有符号的 1 位屏蔽为 24 位相同,并且此 setUint24 实现实际上并没有做任何具体的事情为无符号整数。所以我很确定它应该可以工作。不过也许不是。

标签: javascript byte dataview low-level arraybuffer


【解决方案1】:

正如@Ryan 和@Thomas 所评论的,此方法有效。我认为它不起作用,因为我创建的 wav 文件是纯白噪声。事实证明,虽然这种方法有效,但它可能会以错误的顺序设置字节(这对 wav 文件有问题,但对其他处理没有问题)。请参阅Is there anything special I have to do to create a 24-bit WAV file? 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    相关资源
    最近更新 更多