Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从存储为节点缓冲区的字节数组创建类型化数组_Node.js - Fatal编程技术网

Node.js 从存储为节点缓冲区的字节数组创建类型化数组

Node.js 从存储为节点缓冲区的字节数组创建类型化数组,node.js,Node.js,从有关从缓冲区创建类型化数组的节点: 缓冲区的内存被解释为数组,而不是字节数组。那个 是,newuint32数组(新缓冲区([1,2,3,4])创建一个4元素 uint32阵列带有元素[1,2,3,4],而不是带有单个 元素[0x1020304]或[0x4030201] 这与普通javascript形成对比,在普通javascript中,从ArrayBuffer创建类型化的数组视图使用ArrayBuffer的内存作为字节(就像C++中的reinterpret\u cast)。在节点缓冲区上操作时

从有关从缓冲区创建类型化数组的节点:

缓冲区的内存被解释为数组,而不是字节数组。那个 是,
newuint32数组(新缓冲区([1,2,3,4])
创建一个4元素
uint32阵列
带有元素
[1,2,3,4]
,而不是带有单个 元素
[0x1020304]
[0x4030201]

这与普通javascript形成对比,在普通javascript中,从ArrayBuffer创建类型化的数组视图使用ArrayBuffer的内存作为字节(就像C++中的
reinterpret\u cast
)。在节点缓冲区上操作时,我需要在节点中执行此行为

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


有没有(fast/O(1))方法可以从缓冲区获取类型化数组,使用缓冲区的内容作为字节而不是元素?(所需的类型化数组元素大小大于1字节,不用说。)

据我所知,如果不在内存中复制数据,就不可能做到这一点。 甚至您的示例
newuint32数组(新的缓冲区([1,2,3,4]))
在内部也是这样做的(这意味着它不是O(1))

请注意,类型化数组只是
ArrayBuffer
的视图(而不是
缓冲区
,这是不可能的)
newuint32数组(数组)
创建一个
4*数组的
ArrayBuffer
。长度
字节。您可以使用
uint32数组.buffer
访问它。构造函数处理您的
缓冲区
与普通的
数组
没有区别

我所知道的最好的解决办法是


使用
uint32阵列
进行尝试的另一个问题是它。如果您想安全起见,可以迭代
缓冲区
或使用
数据视图

从node 4.0开始,缓冲区是UINT8数组,可以直接在其上构建新视图:

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

这个小示例假设
b
大于~4096(缓冲区拥有自己的内存块与共享更大的内存块的阈值)。有关更多信息,请参阅-通常应调用
b.slice()
仅对您拥有的内存进行操作。

对数组应该执行什么类型的操作?如果是只读的,那么为什么不直接通过偏移量引用缓冲区中的元素呢?例如:
buf.readUInt32LE(i*4)
其中
i
是数组索引?我需要快速重复地遍历数组。
read*
方法非常慢。我认为没有比这更快的了:如果我们需要索引
I
的Int32值:
var k=I*4;return buf[k]| buf[k+1]我发明了一辆自行车:如果我们看看模块
buffer.js
-就是如何实现reading.NB:
新的uint32数组(b.buffer,b.byteOffset)。长度
->
2046
。。。不起作用。您是对的--可以直接构造,但“as uint8array”不是字节。@shaunc它确实有效,请查看结果的内容。意外长度是节点的共享数组缓冲区分配器的副作用。至少在缓冲区小的时候使用
b.slice
,或者为了安全起见使用
new-uint32数组(b.buffer,b.byteOffset)。slice(0,4)
->
uint32数组[67305985,0,8192,0]
?当我将两个“b”重写为
b.slice(0,4)
时也是这样吗?(注意:节点9.3.0)OOPS。。。我想这是对的:)抱怨。。。在你编辑之前,我不会让我通过向上投票来纠正我的错误——任何编辑都可以,我会向上投票。对不起,没有问题,澄清了。干杯