我在 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);
我得到的结果值是二进制形式但不正确。
执行这种操作的正确方法是什么?