我正在尝试解析二进制消息。
我做了一个获取短值的函数,但是当第二个字节为负数时,这不起作用。例如:
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()
方法,您必须决定哪一种适用于您的模型(