2010-03-11 61 views

回答

4

的步驟是:從字符串十六進制字符

  1. 提取物對。
  2. 將每一對轉換爲十進制數。
  3. 將數字打包爲一個字節。

例如:

use strict; 
use warnings; 

my $string = 'AA55FF0102040810204080'; 
my @hex = ($string =~ /(..)/g); 
my @dec = map { hex($_) } @hex; 
my @bytes = map { pack('C', $_) } @dec; 

或者,表達更簡潔:

use strict; 
use warnings; 

my $string = 'AA55FF0102040810204080'; 
my @bytes = map { pack('C', hex($_)) } ($string =~ /(..)/g); 
+0

感謝我怎麼能做到從@bytes反向操作字符串 – ron 2010-03-12 18:09:25

+0

這並不正常工作。它包裝到:aa:20:55:20:ff:20:01:20:02:20:04:20:08:20:10:20:20:20:40:20:80爲什麼所有的20那裏??? – poosliver 2014-07-01 15:12:49

+0

@poosliver:打包的數據包含不可打印的字符。你看到的將取決於你如何打印它;我不知道你做了什麼。 Data :: Dump(使用不可打印字符的轉義序列)打印的'@ bytes'的值是'「\ xAA」,「U」,「\ xFF」,「\ 1」,「\ 2」 ,「\ 4」,「\ b」,「\ 20」,「」,「\ @」,「\ x80」'。 – 2014-07-01 15:51:15

21
my $bytes = pack "H*", $hex; 

更多信息請參見perlpacktut

+6

我討厭這個教程。爲什麼它必須如此過於複雜。爲什麼他們給我的$ s = pack('H2'x 10,map {「3 $ _」}(0..9));作爲我的($ hex)= unpack('H *',$ mem)的'相反';我認真地認爲他們喜歡儘可能多地糾纏事情。 – Myforwik 2012-01-28 06:22:16

1

我有字符串:

61 62 63 64 65 67 69 69 6a

,我想解釋爲十六進制值,並顯示那些爲ASCII字符(這些值應該重現字符串「ABCDEFGHIJ」)。

通常情況下,我試着寫快是這樣的:

$ echo "61 62 63 64 65 67 69 69 6a" | perl -ne 'print "$_"; print pack("H2 "x10, $_)."\n";' 
61 62 63 64 65 67 69 69 6a 
a 

...然後我在想,爲什麼我得到的只有一個字符後面:)

首先,讓我記下我有字符串,還可以表示爲,它在存儲器中佔用的字節的十六進制值:

$ echo -n "61 62 63 64 65 67 68 69 6a" | hexdump -C 
00000000 36 31 20 36 32 20 36 33 20 36 34 20 36 35 20 36 |61 62 63 64 65 6| 
00000010 37 20 36 38 20 36 39 20 36 61     |7 68 69 6a| 
0000001a 

_(NB:從本質上講,我想「C onvert」在存儲器中作爲輸入上述的字節值,這些下面的,如果由hexdump都看到:

$ echo -n "abcdefghij" | hexdump -C 
00000000 61 62 63 64 65 66 67 68 69 6a     |abcdefghij| 
0000000a 

...這是如何獲得用於輸入十六進制字符串的原始值。 )_

那麼,這Pack/Unpack Tutorial (AKA How the System Stores Data)原來對我來說是最有幫助的,因爲它提到:

pack功能接受一個模板字符串和值的列表[...]

$rec = pack("l i Z32 s2", time, $emp_id, $item, $quan, $urgent);

它返回一個包含根據在模板中指定的格式存儲的值的列表中的標[...]

$rec將包含以下內容(第一行以十進制表示,第二行以十六進制表示,第三行表示適用的字符)。管道字符指示字段邊界。

 Offset Contents (increasing addresses left to right) 
     0 160 44 19 62| 41 82 3 0| 98 111 120 101 115 32 111 102 
       A0 2C 13 3E| 29 52 03 00| 62 6f 78 65 73 20 6f 66 
              | b o x e s  o f

也就是說,在我的情況下,$_字符串變量 - 而pack預計爲輸入幾個這樣的「單」變量的列表(除了格式化模板字符串);並再次輸出一個'單個'變量(但是,這可能是一個相當大的內存!)。在我的情況下,如果輸出的'single'變量在內存中的每個字節中都包含ASCII碼,那麼我就全部設置了(我可以直接打印輸出變量)。

因此,爲了從$_字符串得到的變量列表,我可以簡單地split它在空間的標誌 - 但是,請注意:

$ echo "61 62 63 64 65 67 68 69 6a" | perl -ne 'print "$_"; print pack("H2", split(/ /, $_))."\n";' 
61 62 63 64 65 67 68 69 6a 
a 

...元素的量是pack必須指定ed(否則我們只能返回一個字符);那麼,這兩種方案的工作:

$ echo "61 62 63 64 65 67 68 69 6a" | perl -ne 'print "$_"; print pack("H2"x10, split(/ /, $_))."\n";' 
61 62 63 64 65 67 68 69 6a 
abcdeghij 

$ echo "61 62 63 64 65 67 68 69 6a" | perl -ne 'print "$_"; print pack("(H2)*", split(/ /, $_))."\n";' 
61 62 63 64 65 67 68 69 6a 
abcdeghij 
相關問題