从存储为节点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);