【发布时间】:2012-12-05 04:26:21
【问题描述】:
我正在使用node-msgpack 对机器之间传递的消息进行编码和解码。我想做的一件事是将原始 Buffer 数据包装在一个对象中并使用 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 本身生成的缓冲区,因此对数据进行了双重打包。为避免混淆,我将其替换为通过读取图像获得的另一个缓冲区,这引发了同样的问题。
【问题讨论】:
-
原始代码中的“ac”来自哪里? > new Buffer("Hello World!") 给我“
”(没有“ac”) -
引用上面的
buf = msgpack.pack("Hello World!"):) 这是 msgpack 放在那里的前缀,用于知道以下字节是原始字节并对其长度进行编码。这就是为什么我期待msgpack.unpack(new Buffer(msgpack.unpack(packed).foo));返回"Hello World!"。 -
看起来你是双重包装。 (1) 当你执行 buf = msgpack.pack("Hello World!") 和 (2) 当你执行 packed = msgpack.pack(obj) 时,对吧?
-
好吧,我只是双重打包,因为我想检查使用 msgpack 打包原始缓冲区时的一般情况。如果打包和解包后缓冲区仍然一致,它应该可以工作,对吧?
buf是从压缩数据还是从 JPG 文件中获得的,我猜这无关紧要。
标签: javascript node.js msgpack