perl perlpacktut对我没有意义

时间:2017-11-12 23:35:26

标签: perl

我真的很担心perl的pack和unpack定义。 以下是perl.doc.org的摘录

  

pack函数将值转换为包含的字节序列       根据给定规范的表示,即所谓的       "模板"论点。 unpack是相反的过程,导出一些值       来自一串字节的内容。

所以我认为pack需要人类可读的东西(比如A)并把它变成二进制格式。我对这种解释错了吗?

这就是我的解释,但是然后同样的文件会立即进行这个例子,这使我的理解正好相反。

my( $hex ) = unpack( 'H*', $mem );
print "$hex\n";

我错过了什么?

1 个答案:

答案 0 :(得分:7)

pack函数将一个或多个事物放在一个字符串中。它以一种可以在其他程序中可靠地解压缩的方式将事物表示为八位字节(字节)。那个节目可能很遥远(比如远离火星的距离)。如果它以人类可读或不可读的方式开始并不重要。这不是重点。

考虑一些任务,其中您的数字ID最多约为65,000,字符串最多可包含六个字符。

print pack 'S A6', 137, $ARGV[0];

如果你在运行它时通过十六进制转储器运行它会更容易看到它在做什么:

$ perl pack.pl Snoopy | hexdump -C
00000000  89 00 53 6e 6f 6f 70 79                           |..Snoopy|

第一列计算输出中的位置,因此忽略它。然后前两个八位字节代表S(短,'字',无论什么,但两个八位字节)格式。我给它编号137,它存储为0x8900。然后它在接下来的六个八位字节中存储了“史努比”。

现在尝试使用更短的名字:

$ perl test.pl Linus | hexdump -C
00000000  89 00 4c 69 6e 75 73 20                           |..Linus |

现在末尾有一个空格字符(0x20)。打包数据仍有六个八位字节。尝试使用更长的名称:

$ perl test.pl 'Peppermint Patty' | hexdump -C
00000000  89 00 50 65 70 70 65 72                           |..Pepper|

现在它截断字符串以适应六个可用空格。

考虑一下你通过套接字或其他方式与其他东西进行通信的情况。另一方面的事情知道它将获得八个八位字节。它也知道前两个将是短的,接下来的六个将是名称。假设另一方存储了它$tidy_little_package。它通过解压缩得到单独的值:

my( $id, $name ) = unpack 'S A6', $tidy_little_package;

这就是主意。您可以用完全可逆的二进制格式表示不同类型的许多值。您可以将打包的字符串发送到需要使用的位置。

我在Learning PerlProgramming Perl中有更多pack的例子。