类型化数组的二进制操作



我正在尝试解析二进制消息。

我做了一个获取短值的函数,但是当第二个字节为负数时,这不起作用。例如:

function bytesToShort(arr, offset){
    return (arr[offset] << 8) | arr[offset + 1];
}
let binary = new Int8Array([3, -40]); // equals to 00000011 10101000
bytesToShort(binary, 0); // returns -40
// but 0b0000001110101000 = 936

为什么我得到这个结果??以及如何在不使用 Int16Array 的情况下更改正确答案的功能?

我认为问题的核心是,即使您的类型化数组将值存储在单个字节中,当您检索它们时,JS也会将它们转换为表示相同值的4字节数字,并对这些数字执行操作。如果要从字节数组中检索多字节值,我建议使用 DataView:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView

在您的示例中,这将是:

new DataView(arr.buffer).getInt16(0);

(注意:有一个单独的getInt16()getUInt16()方法,您必须决定哪一种适用于您的模型(

最新更新