2010-07-07 53 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