2016-06-13 99 views
2

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

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

更新根据反馈我做了以下

var arr = new Int16Array(spectrum.buffer) 

这给了我相应的类型,不过字节越来越交换1

。频谱缓冲区以大端存储。

<缓冲E1 D7的e0 B9 E3 52 E2 D5 E2编E2 92 E2 D6 E2 97 E3 04 E1 95 E1 E2> E1 D8 E3 14 E2 FD E1编E2 D3 E3 09 E1 9F E2 14个E2 F2 E2 54 E2 1F E2 54> E2 06 E2 8A ...>

的前三个数字正在说为-10271,-17952,21219

但是他们不应该改变那么多,并且所有三个应该是负面的。

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

所以确实Int16Array节点6采用大尾数法或小尾数,如何处理这个问题。

+0

注:https://nodejs.org/api在你的情况,根据需要为您的数据,你会想使用getInt16方法并设置字节顺序标志/buffer.html#buffer_buffers_and_typedarray看起来好像是可能的,如果你在填充缓冲区之前创建类型化数组*。 –

+0

就这么你知道,我更新了我的答案。如果您需要读取具有特定字节数的数据,则可以使用更低级别的接口。 –

回答

1

当然。 Node.js缓冲区are a special instanceUint8Array

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

var int16Arr = new Int16Array(spectrum_buffer); 

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

var int16Arr = new Int16Array(spectrum_buffer.buffer); 

更新:

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

A DataView是一个缓冲区的包装,它使您可以完全控制数据的访问方式。

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

试试这个:

//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]; 
}