在Golang中解包一个由Perl使用模板”N/a* N/a*”打包的缓冲区。

huangapple go评论94阅读模式
英文:

Unpack a buffer which is packed by perl with template "N/a* N/a*" in golang

问题

我是你的中文翻译助手,以下是翻译好的内容:

我对Perl还不熟悉。我需要编写一个Go语言代码,用于读取从Perl UDP套接字客户端发送的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. "N/a* N/a*"实际上是什么意思?简单的解释会很有帮助。这两个字符串是如何被打包的?
  2. 如果给定两个Unicode字符串,我该如何编写一个类似的打包函数,并且如果我收到从Perl UDP客户端发送的打包缓冲区,我该如何编写一个相应的"在Go语言中"解包函数。是否有任何库可以处理这个问题,以便我可以像Perl一样使用Go语言进行套接字编程。
英文:

I am new to perl. I need to write a golang code which read UDP package sent from a perl UDP socket client. Basically, the perl client packs data using the template "N/a* N/a*" like the following:

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

My question is:

  1. What does "N/a* N/a*" actually means? A simple explanation would be helpful. How two strings are actually packed?
  2. How i can write a similar packing function in golang given two unicode strings; and if I got a packed buffer sent from perl UDP client, how i can write a corresponding function "in golang" to unpack it. Is there any library which can handle this so that I can use golang on par with perl for socket programming.

答案1

得分: 2

pack文档中可以得知:

  • N 表示网络格式的无符号长整型
  • a 表示任意二进制数据的字符串
  • * 表示重复计数,使用字符串中剩余的所有字符
  • / 表示你正在打包一个项目的长度,然后是打包后的项目本身。

你可以编写一个小程序来验证一下:

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

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

say $packed;

运行程序后,你看不到数字,但可以使用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

dog前面有一个00_00_00_03,在parrot前面有一个00_00_00_06。这些是打包字符串的长度。这可能意味着另一端通过读取数字,然后获取相应数量的后续八位字节来扫描字符串。

英文:

From the pack documentation:

  • N is an unsigned long in network format
  • a is a string with arbitrary binary data
  • * is a repeat count that uses up the rest of the characters in the string
  • the / notes that you're packing a length of the item and then the packed item.

You can write a small program to check it out:

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

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

say $packed;

Run it and you won't see the number, but you can hexdump it to see everything:

$ 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

There's a 00_00_00_03 in front of dog and a 00_00_00_06 in front of parrot. Those are the lengths of the packed strings. This probably means the other side scans the string by reading the number, then grabbing that number of succeeding octets.

huangapple
  • 本文由 发表于 2016年1月30日 23:27:56
  • 转载请务必保留本文链接:https://go.coder-hub.com/35103503.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定