如何将JavaScript对象转换为节点缓冲区?

我在我的节点服务器上使用Buffer ,在我的Java客户端上使用Buffer

为了节省字节的目的,我正在寻找发送我的数据到服务器通过websockets作为二进制相对于JSON。

所以,如果我有[ 5, false, 55, "asdf" ]的Javascript对象,我想在发送之前将其转换为客户端上的缓冲区。 也许这样的事情:

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

并在服务器上读取它像这样:

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

我正在看当前的解决scheme,看起来我可能只需要做很多concat ing,指定字节偏移量/长度,从int转换为布尔值等。

有没有更好的办法?

编辑:这是我觉得你现在必须这样做。 我想我的问题只是它太冗长和容易出错,我正在寻找一个更简洁和优雅的方式来做到这一点,因为这个操作将在我的代码中的许多不同的地方执行。

 // 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:谷歌search,我想我可能想要的东西像协议缓冲区。 我不完全确定他们还没有申请,但是看起来你可以在一个文件中为所有的消息指定一个模式,然后将你的JSON对象序列化到这个模式,并让它返回一个缓冲区,然后你可以反序列化在客户端/其他服务器上使用相同的模式。 我会再看看这个。

缓冲区的第一个参数必须是:String,Buffer,ArrayBuffer,Array或类似数组的对象。

考虑到这些信息,我们可以通过从string中创build一个缓冲区来实现你正在寻找的东西。 它看起来像下面这样:

 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> 

然后你可以像这样把你的JSON带回来:

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