从存储为节点Buffer的字节数组创build一个types数组

从关于从缓冲区创buildtypes化数组的节点文档 :

缓冲区的内存被解释为一个数组,而不是一个字节数组。 也就是说, new Uint32Array(new Buffer([1,2,3,4]))创build了一个4元素的Uint32Array元素[1,2,3,4] ,而不是Uint32Array单个元素[0x1020304][0x4030201]

这与普通的javascript形成对比,从ArrayBuffer创build一个types化的数组视图使用ArrayBuffer的内存作为字节。 在节点Buffers上运行时,我需要在节点中使用这种行为。

我可以将缓冲区转换为ArrayBuffer,但是这对于我的应用程序来说太慢了。 (我已经尝试了很多方法 – 但他们都是O(n)时间。)(编辑:我发现的最快的方法是这个 ,这是一个单一的移动操作,相当快,但仍然至less有一瞬间消耗2倍的内存,直到释放原始缓冲区为止。)

有没有(快速/ O(1))的方式来从缓冲区中获取一个types数组,使用缓冲区的内容作为字节而不是元素? (所需的types数组元素大小> 1字节,不用说)。

据我所知,在内存中复制数据是不可能的。 即使你的例子new Uint32Array(new Buffer([1,2,3,4]))内部做到这一点(这意味着它不是O(1))。

请注意,types数组只是ArrayBuffer 视图 (不是Buffer ,这是不可能的)。 new Uint32Array(array)创build一个4 * array.length字节的ArrayBuffer 。 你可以用uint32Array.buffer来访问它。 构造函数对待你的Buffer与正常的Array不同。

我知道的最好的解决scheme是你已经find的 。

使用Uint32Array另一个问题是,它取决于平台的字节顺序 。 你可以像这样迭代Buffer或者如果你想要安全的话可以使用DataView

从节点4.0开始,缓冲区是Uint8Arrays,可以直接在它们上面构build新的视图:

 var b = new Buffer([1,2,3,4]); new Uint32Array(b.buffer, b.byteOffset);