2016-01-30 8 views
-4

Я новичок в perl. Мне нужно написать код golang, который считывает UDP-пакет, отправленный из клиента perl UDP-сокета. В основном, данные Perl клиентские пакеты, используя шаблон "N/A * N/A *", как в следующем:Распаковать буфер, который упакован perl с шаблоном «N/a * N/a *» в golang

$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. Что означает «N/A * N/a * "на самом деле означает? Простое объяснение было бы полезно. Как две строки фактически упакованы?
  2. Как я могу написать аналогичную функцию упаковки в golang, заданную двумя строками unicode; и если я получаю упакованный буфер, отправленный из perl UDP-клиента, как я могу написать соответствующую функцию «в golang», чтобы распаковать ее. Есть ли какая-либо библиотека, которая может справиться с этим, чтобы я мог использовать golang на одном уровне с perl для программирования сокетов.
+0

См. [Perlpacktut] (http://perldoc.perl.org/perlpacktut.html) и [документация для 'pack'] (http://perldoc.perl.org/functions/pack.html). – ThisSuitIsBlackNot

ответ

2

От the pack documentation:

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

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

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

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

say $packed; 

Run, и вы не увидите номер, но вы можете HexDump его, чтобы увидеть все:

$ 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. Это длина упакованных строк. Это, вероятно, означает, что другая сторона сканирует строку, читая номер, а затем захватывая это число последующих октетов.