在NodeJs中将Uint8Array转换为Uint16Array

5
我有一个Uint8Array数组,想将其转换为Uint16Array数组,以便每个连续的一对Uint8Array元素被转换为一个Uint16值。最终,Uint16Array数组大小是Uint8Array数组大小的一半。我想转换整个数组,而不是每个元素。
我找到的唯一解决方案是保持相同长度并更改数组每个元素的基础类型。这样做不会“转换”数组,而是每个数组元素,这不是我想要的。

1
有特别的原因要这样做吗?如果你想这么做,你需要创建一个长度为一半的新数组,并简单地将值设置为(a << 8) + ba + (b << 8),具体取决于你想要做什么。 - Loïc Faure-Lacroix
3个回答

3
你可以使用Uint8Arraybuffer值来实例化Uint16Array
const uint8Array = new Uint8Array([1, 164, 5, 57])
const uint16Array = new Uint16Array(uint8Array.buffer)
// Uint16Array(2) [ 41985, 14597 ]

1

如果我正确理解了问题,我想到的最本地化的方法(尚未确定但需要几行代码)是将其转换为Buffer,然后将其转换为Uint16Array

下面的片段似乎可以实现所需的结果。

const ar8 = new Uint8Array([0, 1, 1, 0, 0, 2, 2, 0]);
const buf = new Buffer(ar8);
const ar16 = new Uint16Array(buf.buffer, buf.byteOffset, buf.byteLength / Uint16Array.BYTES_PER_ELEMENT);

console.log(ar8, buf, ar16);

在我的平台上,转换是小端的;抱歉,我不知道所有平台上的转换是否都是小端的,或者大小端转换是否与平台相关。


0

您当前的解决方案应该可以正常工作。在Uint8Array中,每个元素的“底层类型”都是number,就像在Uint16Array中一样。因此,将整个数组强制转换应该可以保留值的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接