【问题标题】:Nodejs Uint8Array,Uint16Array, Uint32Array [duplicate]Nodejs Uint8Array,Uint16Array,Uint32Array [重复]
【发布时间】:2022-01-17 07:33:08
【问题描述】:

我试图弄清楚如何使用 int 中的缓冲区表示。 简单的代码

var buffer = Buffer.alloc(4, 'a');
var interface16 = new Uint16Array(buffer);
var interface8 = new Uint8Array(buffer);
console.log(interface16);
console.log(interface8);

为什么日志输出相同的数组(按值和长度)?毕竟,我正在以每个整数 1 和 2 个字节的形式进行数据表示。至少手册说 Uint8Array - 从缓冲区中获取 1 个字节,我认为它是 0 和 1 的序列,在本例中为 32(4 * 8)。也就是说,我可以忍受它将是一个包含 4 个元素的数组。 但 Uint16Array 取 2 个字节为一个整数,即个数必须不同,数组的大小为 2。 我错了什么以及将哪个缓冲区传递给这些构造函数以便直观地看到差异? 我怀疑在任何情况下返回的数组的长度都与字节数相同,或者这是控制台如何生成输出的问题。大概。但是没有足够的知识来理解为什么。 感谢您的关注。

附:如果你也直接在这个问题上推荐一些非脑爆的文献,那就太好了。

【问题讨论】:

  • a nodejs Buffer 是,尽管名称,不是 ArrayBuffer 而是 Uint8Array 子类。要访问其底层缓冲区(并将类型化数组构造为其上的视图),您需要编写 new Uint16Array(buffer.buffer);new Uint8Array(buffer.buffer);

标签: javascript node.js binary


【解决方案1】:

在您的示例中,两个类型化数组最终都有 4 个元素,但 Uint8Array 仅使用 4 个字节来表示其内容,而 Uint8Array 使用 8 个。您可以通过检查 byteLength 属性看到这一点:

var buffer = Buffer.alloc(4, 'a');
var interface16 = new Uint16Array(buffer);
var interface8 = new Uint8Array(buffer);
console.log('Uint16 length: %d', interface16.length);
console.log('Uint16 byteLength: %d', interface16.byteLength);
console.log('Uint8 length: %d', interface8.length);
console.log('Uint8 byteLength: %d', interface8.byteLength);

输出

Uint16 长度:4 Uint16 字节长度:8 Uint8 长度:4 Uint8 字节长度:4

因此,类型化数组构造函数正在创建具有与源缓冲区相同数量的 元素 的类型化数组,但 Uint16Array 构造函数为每个元素使用两个字节而不是一个字节,填充高- 每个元素的序字节为零。

【讨论】:

    【解决方案2】:

    首先创建一个包含 4 个 a 的缓冲区。

    然后你用缓冲区调用这个函数:

    文档说:new Uint16Array(object); 当使用对象参数调用时,会创建一个新的类型化数组,就像使用 TypedArray.from() 方法一样。

    查看更多:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/from

    它通过使用缓冲区的每个字节创建一个 4 uint16 的数组

    a = 0x61 = 97 然后你得到四个 97。

    这里是一个成功的缓冲区到 uint16 转换的堆栈溢出 convert nodejs buffer to Uint16Array

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 2019-05-19
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多