以下是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";
我错过了什么?
解决方法
考虑一些任务,其中您的数字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 Perl和Programming Perl中有更多的包装示例.