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)
我得到的结果值是二进制形式,但不正确.
执行此类操作的正确方法是什么?
没有"十六进制数"这样的东西.数字是一个数字,数字的十六进制表示就是 - 表示.
只需将其转换为数字并使用按位和.
my $num = (hex $a) & (hex $b);
print ($num & 1, "\n") while ($num >>= 1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2219 次 |
| 最近记录: |