gpt4 book ai didi

perl perlpacktut 对我来说没有意义

转载 作者:行者123 更新时间:2023-12-04 23:10:08 25 4
gpt4 key购买 nike

我真的很困惑 perl 的打包和解包定义。
下面是摘自 perl.doc.org

The pack function converts values to a byte sequence containing representations according to a given specification, the so-called "template" argument. unpack is the reverse process, deriving some values from the contents of a string of bytes.



所以我明白 pack 需要人类可读的东西(例如 A)并将其转换为二进制格式。这个解释我错了吗??

所以这就是我的解释,但同样的文档立即开始提出这个例子,这使我的理解完全相反。
my( $hex ) = unpack( 'H*', $mem );
print "$hex\n";

我错过了什么?

最佳答案

pack函数将一个或多个东西放在一个字符串中。它将事物表示为八位字节(字节),以一种可以在其他程序中可靠地解包的方式。该计划可能很远(例如,到火星的距离很远)。它是否以人类可读的方式开始并不重要。这不是重点。

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

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

如果您在运行时通过十六进制转储程序运行它,则更容易看到它在做什么:
$ perl pack.pl Snoopy | hexdump -C
00000000 89 00 53 6e 6f 6f 70 79 |..Snoopy|

第一列计算输出中的位置,因此忽略它。那么前两个八位字节代表 S (简称,'word',无论如何,但两个八位字节)格式。我给了它数字 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;

这就是想法。您可以以完全可逆的二进制格式表示许多不同类型的值。您可以将打包的字符串发送到需要使用的任何地方。

我还有更多 pack 的例子在 Learning PerlProgramming Perl .

关于perl perlpacktut 对我来说没有意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47255219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com