Perl打包/拆包/换班

时间:2010-07-07 21:49:57

标签: perl bit shift unpack pack

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

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

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

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

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

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

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

我执行按位AND后发生的第二个问题,我想通过向右移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);

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

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

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

执行此类操作的正确方法是什么?

1 个答案:

答案 0 :(得分:9)

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

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

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