Javascript 对包含Node.js缓冲区的MessagePack对象进行编码

Javascript 对包含Node.js缓冲区的MessagePack对象进行编码,javascript,node.js,msgpack,Javascript,Node.js,Msgpack,我用它来编码和解码机器之间传递的信息。我希望能够做的一件事是将原始缓冲区数据包装到对象中,并使用Messagepack对其进行编码 msgpack = require('msgpack') buf = <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 ...> obj = {foo: buf} packed = msgpack.pack(obj) 在一个完美的世界里,我会得到: new Buffer(msgp

我用它来编码和解码机器之间传递的信息。我希望能够做的一件事是将原始缓冲区数据包装到对象中,并使用Messagepack对其进行编码

msgpack = require('msgpack')
buf = <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 ...>
obj = {foo: buf}
packed = msgpack.pack(obj)
在一个完美的世界里,我会得到:

new Buffer(msgpack.unpack(packed).foo);

#> <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 ...>
新缓冲区(msgpack.unpack(packed.foo));
#> 
相反,我最终得到了一些随机数。再深入一点,我最终会产生以下好奇心:

enc = 'ascii'
new Buffer(buf.toString(enc), enc)
#> <Buffer *ef bf bd* 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 ...>

buf
#> <Buffer *89* 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 02 00 ...>
enc='ascii'
新缓冲区(buf.toString(附件),附件)
#> 
缓冲器
#> 
第一个字节就是问题所在。我尝试使用不同的编码,但没有成功。这里发生了什么?我能做些什么来规避这个问题

编辑:
最初,
buf
是我用msgpack本身生成的缓冲区,因此对数据进行了双重打包。为了避免混淆,我将其替换为通过读取图像获得的另一个缓冲区,这引发了相同的问题。

当使用除
base64
hex
之外的任何编码文本对二进制数据进行解码时,会出现缓冲区损坏问题。似乎没有人捡到。它似乎自动尝试使用“utf-8”,这会不可逆转地破坏缓冲区。他们必须这样做,这样我们就不会得到一堆缓冲区对象而不是普通的字符串,这通常是我们的msgpack对象的组成部分


编辑

上面显示的有问题的三个字节表示UTF-8。快速测试表明,此字符将替换开头无法识别的
0x89
字节:

new Buffer((new Buffer('89', 'hex')).toString('utf-8'), 'utf-8')
//> <Buffer ef bf bd>

因此,虽然我们看到本机javascript msgpack解码器的性能有所提高,但JSON的性能仍然要高得多。

原始代码中的“ac”是从哪里来的?>新的缓冲区(“Hello World!”)给了我“”(不带“ac”)引用上述内容,
buf=msgpack.pack(“Hello World!”)
:)它是msgpack放在那里的前缀,用于知道以下字节是原始字节并对其长度进行编码。这就是为什么我期望
msgpack.unpack(新缓冲区(msgpack.unpack(packed.foo))
返回
“Hello World!”
。看起来您是双重包装。(1) 当您执行buf=msgpack.pack(“Hello World!”)和(2)当您执行packed=msgpack.pack(obj)时,对吗?我只是双重打包,因为我想检查使用msgpack打包原始缓冲区的一般情况。如果在包装和解包后缓冲区仍然是一致的,它应该可以工作,对吗?我想,无论是从压缩数据还是从JPG文件中获取
buf
,都不重要。
new Buffer((new Buffer('89', 'hex')).toString('utf-8'), 'utf-8')
//> <Buffer ef bf bd>
node-msgpack pack:   3793 ms
node-msgpack unpack: 1340 ms

msgpack-js pack:   3132 ms
msgpack-js unpack: 983 ms

json pack:   1223 ms
json unpack: 483 ms