2010-07-07 37 views
2

我一直在Perl中遇到这个问题几天了,在搜遍无数的手册页之后,perldocs和google搜索条件过多,希望这里有人能帮我一把。Perl包/解压/转换

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

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

为十六进制字符串转换为十六进制数,我已经试过这似乎并不下面的方法来工作,当我打印出来检查:

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

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

使用“打印”检查其中每个都没有显示正确的值,也没有使用'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); 

此时一切正常,并使用“打印”我可以看到的与运算的数值看的权利,但是当我试图转移如下:

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

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

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

回答

9

有没有这样的事情作为“十六进制数”。一个数字是一个数字,一个数字的十六进制表示就是 - 表示

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

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

你是不是指'while($ num >> = 1)'? – mob 2010-07-07 22:25:59

+0

@mobrule:可能,是的。谢谢。 – 2010-07-07 22:30:57

+0

啊谢谢,现在更清楚了 – materiamage 2010-07-08 01:29:14