我正在使用node-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)
在上面的示例中,我想对嵌套在对象中的缓冲区的原始字节进行一致性检查。所以buf
是这样获得的:
var buf = fs.readFileSync('some_image.png');
在一个完美的世界里,我会得到:
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 ...>
相反,我最终得到了一些随机数。再深入一点,我最终会产生以下好奇心:
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 ...>
第一个字节是问题所在。我尝试使用不同的编码但没有运气。这里发生了什么,我能做些什么来规避这个问题?
编辑:
最初,这buf
是我使用 msgpack 本身生成的缓冲区,因此对数据进行了双重打包。为避免混淆,我将其替换为通过读取图像获得的另一个缓冲区,这引发了同样的问题。