2015-02-26 3 views
0

У кого-нибудь есть ключ к тому, почему MessagePack от Perl дает разные результаты из этого в Node.js.Как msgpack отличается в perl от node.js

Я пытаюсь распаковать msgpack строку, которая была создана с использованием Message пакета Perl и он не работает

Пример: Array [ «а», «б», «в», «г», "е"]

упаковки его в Perl дает: ABCDEF

упаковки его в Node.js (с использованием различных модулей): ¡a¡b¡c¡ d¡f

У кого-нибудь есть ключ

+1

Что делает ваш взгляд Perl скрипта как? Вы использовали utf8? Также ваш массив из Perl явно отличается, так как он имеет «e». –

ответ

2

Я прочитал спецификацию для msgpack и поэтому пересмотрел этот ответ.

Разница, которую вы видите между данными, закодированными в Node и Perl, просто сводится к представлению данных при печати. Поскольку msgpack - это двоичный формат, вы не можете просто распечатать его на терминале - он не является репрезентативным, потому что байты структуры данных не могут быть распечатаны или привести к тому, что следующий байт будет представлен как нечто совершенно другое.

Этот скрипт perl выводит то же, что и выход узла. Подталкивание perl для представления данных немного по-разному делает его похожим на результат с узла. Специальная часть - use open qw/:std :utf8/;, которая инструктирует Perl конвертировать как можно больше в представление utf-8. Я не тестировал Node, поскольку OP не определил, какие пакеты используются.

#!/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, но после проверки спецификации msgpack нашла, что это часть двоичного сообщения.

+0

Спасибо, я попробую его – user3683370

+0

Это сработало, но могу ли я закодировать a b c d e f на utf8 в узле, а затем передать его в msgpack.unpack? – user3683370

+0

Оба равны строки utf8, поэтому все должно быть хорошо. Однако, если у вас возникли проблемы, нам нужно будет знать, что вы делаете на стороне JS. –

0

То, что я пытаюсь достичь, является следующим: Существует сценарий perl, который записывает в Redis DB файл msgpack, но без кодировки utf8. Затем мне нужно получить значение с помощью node.js и распаковать его. Также мне нужно для сценария на языке Perl, чтобы иметь возможность получить значение из БД и распаковать его

Если я использую в Perl

use strict; 
use warnings; 

use Data::MessagePack; 
use Encode; 

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

my $packed = $mp->pack([qw(a b c d f)]); 
print "packed:".$packed."\n"; 

my $encoded = Encode::encode_utf8($packed); 
print "packed encoded using encode_utf8 :".$encoded."\n"; 

my $decoded = Encode::decode_utf8($encoded); 
print "packed decoded using decode_utf8:".$decoded."\n"; 

my $unpacked = $mp->unpack($decoded); 
print $unpacked."\n"; 

Выход: упаковано: абв DF

упакованное кодируются с использованием encode_utf8: ¡a¡b¡c¡d¡f

упакованы декодируется с использованием decode_utf8: ABCDF

Data :: Mess agePack-> распаковка: дополнительные байты в /home/myname/workspace/test/test_msgpack.pl линии 29.

Таким образом, я либо ничего не конвертировать в Perl в utf8 до и просто отправить его в БД, так что node.js делает все остальное, но ему также необходимо преобразовать данные в формат, который Perl понимает для распаковки.

или

Я ничего node.js не делать, но только с помощью любого модуля msgpack, которые существуют, я распаковывать сообщение для процесса, а также упаковать и сохранить его в базу данных для Perl для извлечения и распаковки ,

Во втором варианте я проблема указанным выше

Data::MessagePack->unpack: extra bytes at /home/myname/workspace/test/test_msgpack.pl line 29. 

и в первом node.js решения не понимает формата msgpack, что PERL сохраненного в БД

+0

Проверить мой обновленный ответ. Надеюсь, это имеет смысл –

Смежные вопросы