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 打包/解包/移位的主要内容,如果未能解决你的问题,请参考以下文章