gpt4 book ai didi

node.js - 从存储为 Node Buffer 的字节数组创建类型化数组

转载 作者:搜寻专家 更新时间:2023-10-31 22:23:50 25 4
gpt4 key购买 nike

来自 Node docs关于从缓冲区创建类型化数组:

The buffer's memory is interpreted as an array, not a byte array. That is, new Uint32Array(new Buffer([1,2,3,4])) creates a 4-element Uint32Array with elements [1,2,3,4], not an Uint32Array with a single element [0x1020304] or [0x4030201].

这与普通 javascript 形成对比,在普通 javascript 中,从 ArrayBuffer 创建类型化数组 View 使用 ArrayBuffer 的内存作为字节(类似于 C++ 中的 reinterpret_cast)。在 Node 缓冲区上操作时,我需要 Node 中的这种行为。

我可以将 Buffer 转换为 ArrayBuffer,但这对我的应用程序来说太慢了。 (我尝试了很多方法——但它们都是 O(n) 时间。)(编辑:我发现最快的方法是 this ,这是一个单一的 memmove op 并且非常快,但仍然有在释放对原始 Buffer 的引用之前,内存消耗最少 2 倍。)

是否有任何(快速/O(1))方法从 Buffer 中获取类型化数组,使用 Buffer 的内容作为字节而不是元素?(所需的类型化数组元素大小为 > 1个字节,不用说了。)

最佳答案

据我所知,如果不在内存中复制数据是不可能做到这一点的。即使是您的示例 new Uint32Array(new Buffer([1,2,3,4])) 也在内部执行此操作(这意味着它不是 O(1))。

请注意,类型化数组只是ArrayBuffer(不是Buffer,这是不可能的)的 View new Uint32Array(array) 创建一个4 * array.length 字节的ArrayBuffer。您可以使用 uint32Array.buffer 访问它。构造函数对待您的 Buffer 与普通的 Array 没有区别。

我知道的最佳解决方案是 the one you already found .

Uint32Array 用于您尝试做的事情的另一个问题是它 depends on platform byte order .您可以像 this 一样遍历 Buffer如果您想要安全,也可以使用 DataView

关于node.js - 从存储为 Node Buffer 的字节数组创建类型化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30604777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com