0

perl の MessagePack が Node.js とは異なる結果をもたらす理由は誰にも分かりますか?

Perl の Message Pack を使用して作成された msgpack 文字列を解凍しようとしていますが、機能しません

例: 配列 ["a","b","c","d","f"]

これを Perl でパッキングすると、 ��a�b�c�d�e�f になります。

node.js にパックします (さまざまなモジュールを使用): ¡a¡b¡c¡d¡f

誰も手がかりを持っていますか

4

2 に答える 2

2

msgpack の仕様を読んだので、この回答を修正しました。

Node でエンコードされたデータと Perl でエンコードされたデータの違いは、単純に印刷時のデータの表現にあります。msgpack はバイナリ形式であるため、単に端末に出力することはできません。データ構造のバイトが出力できないか、次のバイトがまったく異なるものとして表現されるため、代表的ではありません。

この perl スクリプトは、ノードの出力と同じものを出力します。データをわずかに異なる方法で表現するように perl を微調整すると、Node.js からの出力と同じように見えます。特別な部分はuse open qw/:std :utf8/;、可能な限り utf-8 表現に変換するように Perl に指示する です。OPが使用するパッケージを定義していないため、Nodeをテストしていません。

#!/usr/env perl
use strict;
use warnings;

use open qw/:std :utf8/;

use Data::Dumper;
use Data::MessagePack;

my $mp = Data::MessagePack->new();

my $packed = $mp->pack([qw(a b c d f)]);

print sprintf("packed: %s\n", $packed);
print Dumper $mp->unpack($packed);

出力は次のようになります。

packed: ¡a¡b¡c¡d¡f
$VAR1 = [
          'a',
          'b',
          'c',
          'd',
          'f'
        ];

私の端末では、パックされた文字列の先頭にゼロ幅の文字があります。その文字は貼り付けません。最初は utf-8 BOM だと思っていましたが、msgpack の仕様を確認したところ、これはバイナリ メッセージの一部であることがわかりました。

于 2015-02-26T15:50:25.053 に答える