Perl-pack-和-unpack

介绍

Perl 的 pack 用于将数据结构根据预定义的 template (自己编写) 打包为字符串 (通常是二进制字符串), unpack 则是利用 template 定义的提取方式从字符串中提取数据结构.

pack 函数语法如:

1
$binary_string = pack(TEMPLATE, LIST);
  • TEMPLATE 也是一个字符串, 描述了如何打包
  • LIST 是要打包的列表

示例:

1
my $binary_data = pack("C2n", 192, 168, 80);

一般情况下, 一个模板字符处理列表中的一个元素, 比如有 C 模板字符可以处理一个无符号字符, C2 则可以处理两个. (不同模板字符的工作方式似乎不同)

unpack 函数语法为:

1
@values = unpack(TEMPLATE, $binary_string);
  • TEMPLATE 是一个字符串, 描述了如何提取
  • binary_string 是目标二进制字符串

示例:

1
my ($byte1, $byte2, $port) = unpack("C2n", $binary_data);

模板字符列表

  • A: ASCII 字符 (空格填充)
  • a: ascii 字符 (NULL 字符填充)
  • H: HEX, 十六进制字符串 (高位优先)
  • h: hex, 十六进制字符串 (低位优先)
  • C: 无符号字符 (8 位)
  • S: Short, 无符号短整数 (16 位)
  • L: Long, 无符号长整数 (32 位)
  • N: Network, 网络字节序 (大端) 的 32 位无符号长整
  • n: network, 网络字节序 (大端) 的 16 位无符号短整
  • V: 小端字节序的 32 位无符号长整数
  • v: 小端字节序的 16 位无符号短整数
  • x: 跳过一个字符

除了用数字指定模板字符匹配的长度外, 可以用 * 匹配所有.

Reference

主要查阅 perldoc perlpacktut. (看到 290 行了)


Perl-pack-和-unpack
http://example.com/2024/05/21/Perl-pack-和-unpack/
作者
Jie
发布于
2024年5月21日
许可协议