Perl打包/拆包/换档

mat*_*age 2 perl unpack shift bit pack

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

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

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

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

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

$a = sprintf("%H", $a);
Run Code Online (Sandbox Code Playgroud)

使用'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);
Run Code Online (Sandbox Code Playgroud)

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

$output = pack("B*", $output);
$output = $output >> 1;
$output = unpack("B*", $output);
Run Code Online (Sandbox Code Playgroud)

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

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

Ano*_*on. 9

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

只需将其转换为数字并使用按位和.

my $num = (hex $a) & (hex $b);
print ($num & 1, "\n") while ($num >>= 1)
Run Code Online (Sandbox Code Playgroud)