perl - 在 golang 中使用模板 "N/a* N/a*"解压由 perl 打包的缓冲区

标签 perl sockets go pack

我是 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 $!;

我的问题是:

  1. “N/a* N/a*”究竟是什么意思?一个简单的解释会很有帮助。两个字符串实际上是如何打包的?
  2. 如何在给定两个 unicode 字符串的情况下用 golang 编写类似的打包函数;如果我收到从 perl UDP 客户端发送的打包缓冲区,我如何“在 golang 中”编写相应的函数来解包它。是否有任何库可以处理此问题,以便我可以像使用 perl 一样使用 golang 进行套接字编程。

最佳答案

来自 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;

运行它,你不会看到数字,但你可以 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_03parrot 前面有一个00_00_00_06。这些是打包字符串的长度。这可能意味着另一端通过读取数字扫描字符串,然后获取该数量的后续八位字节。

关于perl - 在 golang 中使用模板 "N/a* N/a*"解压由 perl 打包的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35103503/

相关文章:

windows - 当客户端在下载过程中关闭网页时,Perl cgi 脚本仍在运行

用于多寄存器嵌套标签的 Perl XML 编辑

c++ - getnameinfo() c++ 的奇怪结果

javascript - JS : Node. js 和 Socket.io - 全局变量和架构

go - 有条件地为 x86 和 mips 构建 go 源代码

hash - 如何在 Go 中获取十六进制编码的 md5 哈希

perl - Perl 中单引号和双引号有什么区别?

regex - 正则表达式 while 循环内的代码块正在工作,但在手动终止之前不会显示结果

c++ - 如何在 C++ 套接字 tcp/ip 中异步发送和接收数据和确认?

unit-testing - 仅为 _test.go 文件定义结构