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

Javascript Node.js缓冲区到类型化数组,javascript,node.js,Javascript,Node.js,在node.js中,我有一个缓冲区(它作为blob存储在mysql中,并使用sequelize检索) 我知道这个缓冲区是一个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++)

在node.js中,我有一个缓冲区(它作为blob存储在mysql中,并使用sequelize检索) 我知道这个缓冲区是一个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);
    }
这给了我合适的类型,但是字节被交换了。频谱缓冲区存储在big-endian中

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

前三个数字分别是-10271、-17952、21219

然而,它们之间的差异不应该太大,三者都应该是负面的

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

那么节点6上的Int16Array是采用大端还是小端,我该如何处理这个问题。

当然。缓冲区的Node.js

因此,如果要创建的实例,可以创建缓冲区的副本:

var int16Arr = new Int16Array(spectrum_buffer);
或者创建一个引用相同基础缓冲区的新数组,这意味着您不必复制所有数据:

var int16Arr = new Int16Array(spectrum_buffer.buffer);
更新:

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

DataView
是一个围绕缓冲区的包装器,它使您能够完全控制数据的访问方式。在您的情况下,您可能希望使用该方法并根据需要为数据设置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];
}
//这是一个缓冲区
var谱_buffer=谱[idx][“谱”];
//这两个视图共享相同的内存
var int16view=新的Int16Array(频谱缓冲区);
var uint8view=新的Uint8Array(频谱缓冲区);
var解析_谱=[];
对于(变量i=0;i
注意:如果您在填充缓冲区之前创建类型化数组,看起来确实有可能。正如您所知,我更新了我的答案。如果需要读取具有特定尾数的数据,则可以使用更低级别的接口。上面的
new Int16Array
调用都将为每个字节创建1个值,而不是从字节数据重新创建类型化数组。@TomášZato如果要从字节数据重新创建类型化数组,请参阅和了解背景信息,然后阅读手册,了解如何执行此操作。
//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];
}