Распаковать буфер, упакованный perl с шаблоном N/a* N/a* в golang

Я новичок в перле. Мне нужно написать код golang, который читает пакет UDP, отправленный с клиента сокета Perl UDP. По сути, Perl-клиент упаковывает данные, используя шаблон «N/a* N/a*», как показано ниже:

$them = pack($sockaddr,&AF_INET, $data_port, $broadaddr);
$actual_data = pack("N/a* N/a*", $string1, $string2);
send(S,$actual_data,0,$them) || die $!;

Мой вопрос:

  1. Что на самом деле означает «Н/д* Н/д*»? Было бы полезно простое объяснение. Как на самом деле упакованы две строки?
  2. Как я могу написать аналогичную функцию упаковки в golang с двумя строками Unicode; и если я получил упакованный буфер, отправленный из Perl UDP-клиента, как я могу написать соответствующую функцию «в golang», чтобы распаковать его. Есть ли какая-нибудь библиотека, которая может справиться с этим, чтобы я мог использовать golang наравне с perl для программирования сокетов.

person auxdx    schedule 30.01.2016    source источник
comment
См. perlpacktut и документация для pack.   -  person ThisSuitIsBlackNot    schedule 30.01.2016


Ответы (1)


Из документации пакета:

  • N — беззнаковое длинное в сетевом формате
  • a — это строка с произвольными двоичными данными
  • * — это счетчик повторов, который использует остальные символы в строке.
  • / отмечает, что вы упаковываете часть предмета, а затем упакованный предмет.

Вы можете написать небольшую программу, чтобы проверить это:

use v5.10;
my $first  = 'dog';
my $second = 'parrot';

my $packed = pack "N/a* N/a*", $first, $second;

say $packed;

Запустите его, и вы не увидите номер, но вы можете сделать шестнадцатеричный дамп, чтобы увидеть все:

$ perl5.22.0 pack.pl
dogparrot

$ perl5.22.0 pack.pl | hexdump -C
00000000  00 00 00 03 64 6f 67 00  00 00 06 70 61 72 72 6f  |....dog....parro|
00000010  74 0a                                             |t.|
00000012

00_00_00_03 стоит перед dog, а 00_00_00_06 перед parrot. Это длины упакованных строк. Это, вероятно, означает, что другая сторона сканирует строку, читая число, а затем захватывая это количество последующих октетов.

person brian d foy    schedule 30.01.2016