【发布时间】: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 更改为setInt16 和setUint8 更改为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