2016-06-13 3 views
2

node.js에 나는 버퍼가 있습니다 (이것은 mysql에 blob로 저장되고 sequelize를 사용하여 검색되었습니다) 이 버퍼는 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가 느리며 arraybuffers에 대한 typedarrays가 있다는 것을 읽었습니다. (이는 Buffers와 다릅니다). 이 버퍼로부터 int의 배열을 작성하는보다 좋은 방법이 존재합니다.

업데이트는 1

내가 나에게 바이트 교환지고 있지만 적절한 유형을 제공하는 다음

var arr = new Int16Array(spectrum.buffer) 

을했던 의견을 바탕으로. 스펙트럼 버퍼는 빅 엔디안으로 저장됩니다.

< 버퍼 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 1 층 E2 54> E2 06 E2의 8A ...>

처음 세 숫자는 가로 질러오고있다 그들이 많은 것을 변화하지 않아야하지만 -10271, -17952, 21219

와 세 가지로해야 부정적이다.

첫 번째 숫자는 (의 보수는 항상 보완 나를 혼란)

그래서 노드에서 Int16Array을한다 (6) 빅 엔디안 또는 리틀 엔디안을 가정하고 나는이 문제를 어떻게 처리하나요 -7721해야한다.

+0

참고 : https://nodejs.org/api 데이터를 저장하기위한 필요에 따라 귀하의 경우에, 당신은 getInt16 방법을 사용하고 엔디안 플래그를 설정할 것 /buffer.html#buffer_buffers_and_typedarray 버퍼를 채우기 전에 입력 된 배열을 만들면 가능합니다. –

+0

그냥 알다시피, 나는 내 대답을 업데이 트했습니다.특정 엔디안을 사용하여 데이터를 읽어야 할 경우 사용할 수있는 더 낮은 수준의 인터페이스가 있습니다. –

답변

1

확실히. Node.js 버퍼 are a special instanceUint8Array입니다.

var int16Arr = new Int16Array(spectrum_buffer); 

또는 당신이하지 않는 것을 의미 동일한 기본 버퍼를 참조하는 새로운 배열을 만들 : 당신이 당신의 버퍼의 복사본을 생성 할 수있는 Int16Array의 인스턴스를 생성하기를 원한다면 그래서

모든 데이터를 복사하려면 :

var int16Arr = new Int16Array(spectrum_buffer.buffer); 

업데이트 : 네이티브 바이트 순서를 사용하는

형식화 된 배열의 기본. 바이트 순서를 지정해야하는 경우 낮은 수준의 인터페이스 인 DataView을 사용할 수 있습니다.

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