2015-12-17 18 views
1

例如,數字178應該轉換爲字母「M」。如何反轉Perl中無符號字節的位?

178是10110010.

倒車所有比特應給予01001101,它是77或 「M」 作爲字符。 我教過關於使用Reverse函數,但我不知道如何在@array上使用它。

use strict; 
use warnings 'all'; 

    open(my $fh1, '<', 'sym.dat') or die $!; 
    open(my $fh2, '<', 'sym2.txt') or die $!; 
    open my $fh_out, '>', 'symout.txt' or die $!; 

    until (eof $fh1 or eof $fh2) { 

     my @l1 = map hex, split '', <$fh1>; 
     my @l2 = map hex, split '', <$fh2>; 
     my $n = @l2 > @l1 ? @l2 : @l1; 

     my @sum = map { 
      no warnings 'uninitialized'; 
     $l1[$_] + $l2[$_]; 
    } 0 .. $n-1; 
     @sum = map { split //, sprintf '%08X', $_ } @sum; 
     print { $fh_out } "reverse @sum\n"; 
    } 

我在這裏計算十六進制值的總和,但問題是相同的我想扭轉字節值。

+0

的代碼添加到您的問題 –

+0

打印{$ fh_out }「reverse @sum \ n」; 「fh_out是從2個文件輸出十六進制和的輸出文件」 –

+0

IMO您的問題有一個令人誤解的標題。你不是想顛倒位。反轉位通常被理解爲意味着翻轉它們的值,即一個變爲零,而零變成一個。 – antred

回答

1

您只需將數組傳遞給函數即可在數組上調用reverse()。但是,像所有的Perl函數一樣,你不能在一個字符串內部進行函數調用。因此,而不是

print { $fh_out } "reverse @sum\n"; 

你想:

print { $fh_out } reverse(@sum), "\n"; 

各地@sum括號是這裏需要防止新行被包含在參數reverse

+0

謝謝你很多戴夫:) –

+0

如果我的回覆對你有用,請考慮upvoting或接受它。 –

0

最短我可以想出反轉是~pack "C", 178(eta:但你的標題和你的文本是相當混亂的,你是否要翻轉或反轉它們,你的位模式對於兩者都有相同的結果,但是這通常不一樣)。在後一種情況下,人們可以做pack "B8", scalar reverse unpack "B8", pack "C", 178,只是不要忘記添加評論;-)。

+1

我可以問一下翻轉位和反轉它們有什麼區別嗎? –

+2

翻轉位意味着將所有零全部轉換爲零。所以11111100變爲00000011.反轉位意味着顛倒順序。所以11111100變成了00111111.你的代碼正在反轉這些位。但是你要求幫助顛倒位。翻轉是翻轉的另一個詞。 –

+0

謝謝你解釋對我來說,我想扭轉秩序,所以它沒關係:) –

0

這逆位:

>perl -E"say pack 'C', ~178 & 0xFF" 
M 

此反轉位:

>perl -E"say pack 'B8', unpack 'b8', pack 'C', 178" 
M 

此反轉位:

>perl -E"say pack 'b8', sprintf '%08b', 178" 
M 
+0

非常感謝您的澄清,我可以問一個問題嗎?並很抱歉在這裏做,但我沒有在問題部分留下任何問題。我如何強制perl以每8位讀取一個十六進制值的方式從兩個文件中讀取數據,因爲在這種情況下,它將每一位都讀取爲十六進制值。預先感謝您:) –

+0

「讀取8位爲1的十六進制值」沒有意義(十六進制是一個數字的字符串表示),所以我不明白這個問題。 – ikegami

+0

如果您有文件1:00 00 00 0f;文件2:00 00 00如果輸出總和爲:00 00 00 01e而不是「00 00 00 1e」 –