2

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

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

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

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

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

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

使用“打印”来检查其中的每一个都不会显示正确的值,使用“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);

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

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

4

1 回答 1

9

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

只需将其转换为数字并使用按位与。

my $num = (hex $a) & (hex $b);
print ($num & 1, "\n") while ($num >>= 1)
于 2010-07-07T22:04:32.137 回答