回答
的步驟是:從字符串十六進制字符
- 提取物對。
- 將每一對轉換爲十進制數。
- 將數字打包爲一個字節。
例如:
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);
my $bytes = pack "H*", $hex;
更多信息請參見perlpacktut。
我討厭這個教程。爲什麼它必須如此過於複雜。爲什麼他們給我的$ s = pack('H2'x 10,map {「3 $ _」}(0..9));作爲我的($ hex)= unpack('H *',$ mem)的'相反';我認真地認爲他們喜歡儘可能多地糾纏事情。 – Myforwik 2012-01-28 06:22:16
我有字符串:
「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
- 1. 如何將十六進制字符串轉換爲十進制?
- 2. 將字符串轉換爲十六進制到十六進制
- 3. 如何在Perl中將十進制數轉換爲十六進制字符串?
- 4. 將十六進制字符串轉換爲Java中的字節
- 5. 將十六進制字符串轉換爲C++中的字節
- 6. C#字符串爲十六進制,十六進制到字節轉換
- 7. 字符串爲十六進制和十六進制轉換爲字符串
- 8. 將字節數組轉換爲十六進制十進制字符串
- 9. 如何將十六進制字符串轉換爲十六進制?
- 10. 將ASCII字符轉換爲十六進制轉義字符串
- 11. 將十六進制字符串轉換爲字符串
- 12. Swift3將字符串值轉換爲十六進制字符串
- 13. 從字節數組轉換爲字符串十六進制c#
- 14. C# - 字節數組轉換爲十六進制字符串
- 15. 從十六進制字符串轉換爲十六進制字符數組
- 16. 將字符串轉換爲十六進制的字符集?
- 17. 如何將十六進制字符串直接轉換爲字節數組?
- 18. 如何將十六進制字符串轉換爲字節數組?
- 19. 如何將包含十六進制對的字符串轉換爲字節?
- 20. 如何將字節數組轉換爲十六進制字符串?
- 21. 如何將十六進制字符串轉換爲字節數組?
- 22. 如何在Go中直接將十六進制字符串轉換爲[]字節?
- 23. 如何將十六進制值轉換爲字符串和字節數組
- 24. 將4字節十六進制轉換爲十進制值
- 25. VB.Net - 將多字節十六進制值轉換爲十進制
- 26. 使用遞歸將int轉換爲十六進制字符串
- 27. 使用'sprintf'將十六進制轉換爲字符串
- 28. 將多字節字符轉換爲十六進制
- 29. 如何將字符串轉換爲十六進制和十六進制字符串?
- 30. 轉換十六進制字符串十六進制值
感謝我怎麼能做到從@bytes反向操作字符串 – ron 2010-03-12 18:09:25
這並不正常工作。它包裝到: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
@poosliver:打包的數據包含不可打印的字符。你看到的將取決於你如何打印它;我不知道你做了什麼。 Data :: Dump(使用不可打印字符的轉義序列)打印的'@ bytes'的值是'「\ xAA」,「U」,「\ xFF」,「\ 1」,「\ 2」 ,「\ 4」,「\ b」,「\ 20」,「」,「\ @」,「\ x80」'。 – 2014-07-01 15:51:15