Intereting Posts

Node.js缓冲区input数组

在node.js我有一个缓冲区(它被存储为一个blob在MySQL中,并使用sequelize检索)我知道这个缓冲区是一个16位整数数组。 在过去,我用for循环parsing了代码。

var spectrum_buffer = spectrums[idx]["spectrum"];//this is a buffer var parsed_spectrum = []; for (var i = 0; i < spectrum_buffer.length / 2; i++) { parsed_spectrum[i] = spectrum_buffer.readInt16BE(i * 2); } 

我读过readInt16BE是缓慢的,现在有arrays缓冲器的typedarrays。 (这是不同于缓冲区)。 有没有更好的方法从这个缓冲区创build一个整数的数组。

更新1

根据反馈,我做了以下

 var arr = new Int16Array(spectrum.buffer) 

这给了我适当的types,但字节正在交换。 频谱缓冲区以大端存储。

<缓冲e1 d7 e0 b9 e3 52 e2 d5 e2 ed e2 92 e2 d6 e2 97 e3 04 e1 95 e1 e2> e1 d8 e3 14 e2 fd e1 ed e2 d3 e3 09 e1 9f e2 14 e2 f2 e2 54 e2 1f e2 54> e2 06 e2 8a …>

前三个数字是-10271,-17952,21219

但是,他们不应该有太大的差异,三者都应该是负面的。

第一个数字应该是-7721(二进制补码总是让我困惑)

那么节点6上的Int16Array假设是大端还是小端,我该如何处理。

Solutions Collecting From Web of "Node.js缓冲区input数组"

当然。 Node.js缓冲区是 Uint8Array 的特殊实例 。

所以如果你想创build一个Int16Array的实例,你可以创build一个你的缓冲区的副本:

 var int16Arr = new Int16Array(spectrum_buffer); 

或创build一个引用相同底层缓冲区的新数组,这意味着您不必复制所有数据:

 var int16Arr = new Int16Array(spectrum_buffer.buffer); 

更新:

键入的数组默认使用本地字节顺序。 如果您需要指定字节顺序,则可以使用较低级别的接口: DataView

DataView是一个Buffer的包装器,它可以让你完全控制数据的访问方式。 在你的情况下,你会想要使用getInt16方法,并根据需要设置你的数据的endianess标志:

 var littleEndian = true; // or false, depends on your needs var dataView = new DataView(spectrum.buffer); dataView.getInt16(offset, littleEndian); 

尝试这个:

 //this is a buffer var spectrum_buffer = spectrums[idx]["spectrum"]; // these two views share same memory var int16view = new Int16Array(spectrum_buffer); var uint8view = new Uint8Array(spectrum_buffer); var parsed_spectrum = []; for (var i = 0; i < int16view.length; i++) { // swap byte order [uint8view[i*2], uint8view[i*2+1]] = [uint8view[i*2+1], uint8view[i*2]]; // ES6 swap // read swapped bytes as Int16 parsed_spectrum[i] = int16view[i]; }