英文:
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 $!;
我的问题是:
- "N/a* N/a*"实际上是什么意思?简单的解释会很有帮助。这两个字符串是如何被打包的?
- 如果给定两个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:
- What does "N/a* N/a*" actually means? A simple explanation would be helpful. How two strings are actually packed?
- 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 formata
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论