Node.js缓冲区到类型化数组



在node.js中,我有一个缓冲区(它以blob的形式存储在mysql中,并使用sequelize进行检索)我知道这个Buffer是一个由16位整数组成的数组。在过去,我使用for循环来解析代码。

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很慢,现在有数组缓冲区的typedarray。(不同于Buffers)。有没有更好的方法从这个缓冲区创建一个int数组。

更新1

根据反馈,我做了以下

var arr = new Int16Array(spectrum.buffer)

这给了我合适的类型,但字节正在交换。频谱缓冲区存储在big-endian中。

<缓冲区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是采用大端序还是小端序,以及如何处理这一问题。

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

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

var int16Arr = new Int16Array(spectrum_buffer);

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

var int16Arr = new Int16Array(spectrum_buffer.buffer);

更新:

类型化数组默认使用本机字节顺序。如果需要指定字节顺序,可以使用较低级别的接口:DataView

DataView是缓冲区的包装器,它使您能够完全控制数据的访问方式。在您的情况下,您可能希望使用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];
}

最新更新