내 노드 서버에 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 객체를 해당 스키마로 직렬화하고 버퍼를 반환 할 수있는 것처럼 보입니다. 클라이언트/다른 서버에서 동일한 스키마를 사용하여 역 직렬화합니다. 이 부분을 좀 더 살펴볼 것입니다.
)를 소켓에 어쨌든 gzip은 배열에 JSON 반복을 처리해야합니다. 어쨌든 배열은 거의 없습니다. – dandavis
@dandavis : 왜 그것은 얼룩이어야합니까? 당신은 할 수 없어'connection.binaryType = "arraybuffer";'? –
어쩌면, 내가 소켓 옵션이라는 것을 몰랐다. 지난번에 내가 더러워 졌을 뿐이었다. 단지 Blob이 내 프로젝트에서 일하고 있었다 ... – dandavis