node-msgpackを使用して、マシン間で受け渡されるメッセージをエンコードおよびデコードしています。私ができるようにしたいことの1つは、生の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自体で生成したバッファーであり、データを二重にパックしていました。混乱を避けるために、画像を読み取って取得した別のバッファに置き換えたところ、同じ問題が発生しました。