Perl 打包/解包/移位

Posted

技术标签:

【中文标题】Perl 打包/解包/移位【英文标题】:Perl pack/unpack/shift 【发布时间】:2010-07-07 21:49:56 【问题描述】:

我在 Perl 中遇到这个问题已经好几天了,在搜索了无数手册页、perldocs 和谷歌搜索太多搜索词之后,希望这里有人可以帮助我。

我得到了两个代表十六进制值的字符串,即“FFFF”,而不是 Perl 十六进制数 0xFFFF。给定其中两个字符串,我希望将它们转换为二进制形式,对两者进行按位与运算,然后取其输出并检查从 LSB 到 MSB 的每一位。

我现在有两个问题;将十六进制字符串转换为十六进制数,并移位 按位与的结果。

为了将十六进制字符串转换为十六进制数字,我尝试了以下方法,当我将它们打印出来进行检查时似乎不起作用:

$a = unpack("H*", pack("N*", $a));

$a = sprintf("%H", $a);

使用 'print' 来检查每一个都不会显示正确的值,使用 'sprintf' 也不会...

第二个问题发生在我执行按位与之后,我想通过右移 1 来检查每个位。为了避免上一个问题,我使用实际的 Perl 十六进制数字而不是十六进制字符串(0xffff 而不是 " ffff”)。如果我尝试按如下方式右移:

#Convert from hex number to binary number

$a = sprintf("%B", $a);
$b = sprintf("%B", $b);

$temp = pack("B*", $a) & pack("B*", $b);
$output = unpack("B*", $temp);

此时一切看起来都很好,使用“打印”我可以看到 AND 操作的值看起来是正确的,但是当我尝试按如下方式移动时:

$output = pack("B*", $output);
$output = $output >> 1;
$output = unpack("B*", $output);

我得到的结果值是二进制形式但不正确。

执行这种操作的正确方法是什么?

【问题讨论】:

【参考方案1】:

没有“十六进制数”这样的东西。数字就是数字,数字的十六进制表示就是这样 - 表示

只需 turn it into a number 并使用按位与。

my $num = (hex $a) & (hex $b);
print ($num & 1, "\n") while ($num >>= 1)

【讨论】:

您的意思是while ($num >>= 1) 吗? @mobrule:可能,是的。谢谢。

以上是关于Perl 打包/解包/移位的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中使用“打包/解包”?

获取 Perl 打包/解包模板的元素数量

Perl 打包/解包和二进制字符串的长度

Perl 中字符串的最快校验位例程是啥?

Perl 解包和换行符

Perl 中的解包功能要求