我是 perl 的新手。我需要编写一个 golang 代码来读取从 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 字符串的情况下用 golang 编写类似的打包函数;如果我收到从 perl UDP 客户端发送的打包缓冲区,我如何“在 golang 中”编写相应的函数来解包它。是否有任何库可以处理此问题,以便我可以像使用 perl 一样使用 golang 进行套接字编程。
最佳答案
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
。这些是打包字符串的长度。这可能意味着另一端通过读取数字扫描字符串,然后获取该数量的后续八位字节。
关于perl - 在 golang 中使用模板 "N/a* N/a*"解压由 perl 打包的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35103503/