2016-07-08 3 views
7

내 노드 서버에 Buffer을 사용하고 Javacript 클라이언트에 Buffer을 사용하고 있습니다.Javascript 객체를 노드 버퍼로 변환하는 방법은 무엇입니까?

바이트를 절약하기 위해 웹 소켓을 통해 JSON과 반대로 바이너리로 데이터를 보내려고합니다.

따라서 JavaScript 객체가 [ 5, false, 55, "asdf" ] 인 경우이를 보내기 전에 클라이언트의 버퍼로 변환하고 싶습니다. 이 같은 아마 뭔가 :

object.toBuffer('int16', 'bool', 'int16', 'utf8'); 

와 같은 서버 뭔가를 읽어

var obj = buffer.read('int16', 'bool', 'int16', 'utf8'); 

내가 현재 솔루션을 찾고 있어요 및 concat을 많이 할 단지에 내가있을 수 있습니다 것 같습니다 바이트 오프셋/길이 지정, 정수에서 부울로 변환 등

더 좋은 방법이 있습니까?

편집 : 다음은 현재 어떻게해야하는지 생각합니다. 내 문제는 그게 너무 장황하고 오류가 발생하기 쉽고,이 작업이 내 코드의 여러 곳에서 수행되기 때문에보다 간결하고 우아한 방법을 찾고있는 것입니다.

// On client for [ 5, false, 55, "test" ] 

const writeFirst = Buffer.allocUnsafe(2); 
writeFirst.writeInt16LE(5, 0); 
const writeSecond = Buffer.allocUnsafe(1); 
writeSecond.writeUInt8(0); 
const writeThird = Buffer.allocUnsafe(2); 
writeThird.writeInt16LE(55, 0); 
const writeFourth = Buffer.from('test'); 

const result = Buffer.concat([writeFirst, writeSecond, writeThird, writeFourth]); 

// On server for reading buffer of [ 5, false, 55, "test" ] 

const readFirst = result.readInt16LE(0); 
const readSecond = Boolean(result.readUInt8(2)); 
const readThird = result.readInt16LE(3); 
const readFourth = result.toString('utf8', 5); 

편집 # 2 : 주변에 인터넷 검색을하고 있었고, 난 내가 프로토콜 버퍼 같은 것을 할 수 있습니다 생각합니다. 나는 그들이 아직 무엇인지 또는 적용하고 있는지 확실하지 않지만 모든 메시지에 대해 파일에 스키마를 지정한 다음 JSON 객체를 해당 스키마로 직렬화하고 버퍼를 반환 할 수있는 것처럼 보입니다. 클라이언트/다른 서버에서 동일한 스키마를 사용하여 역 직렬화합니다. 이 부분을 좀 더 살펴볼 것입니다.

+0

)를 소켓에 어쨌든 gzip은 배열에 JSON 반복을 처리해야합니다. 어쨌든 배열은 거의 없습니다. – dandavis

+0

@dandavis : 왜 그것은 얼룩이어야합니까? 당신은 할 수 없어'connection.binaryType = "arraybuffer";'? –

+0

어쩌면, 내가 소켓 옵션이라는 것을 몰랐다. 지난번에 내가 더러워 졌을 뿐이었다. 단지 Blob이 내 프로젝트에서 일하고 있었다 ... – dandavis

답변

7

버퍼의 첫 번째 인수는 문자열, 버퍼, ArrayBuffer, Array 또는 배열과 같은 객체 여야합니다.

해당 정보를 고려하여 문자열에서 버퍼를 생성하여 원하는 정보를 구현할 수 있습니다. 과 같이 다시 그런 다음 당신은 당신의 JSON을 가져올 수

let json = [ 5, false, 55, 'asdf' ]; 

let buffer = Buffer.from(JSON.stringify(json)); 
console.log('Buffer: ', buffer); // Buffer: <Buffer 5b 20 35 2c 20 66 61 6c 73 65 2c 20 35 35 2c 20 22 61 73 64 66 22 20 5d> 

: 그것은 다음과 같이 보일 것입니다 당신이 (보낼 물방울로 버퍼를 변환해야

let converted = JSON.parse(buffer); 
console.log('Parsed to json', converted); // Parsed to json [ 5, false, 55, 'asdf' ] 
+2

'새로운 Buffer()'는 현재 더 이상 사용되지 않습니다 (노드 8.2에서 여전히 작동 중이라 할지라도). 지원되는 메소드는'Buffer.from ()'입니다. – Danibix

관련 문제