16 進文字列 (長さ 48 文字) をパック関数でraw バイトに変換して、バイトの Win32 ベクトルに入れたいと考えています。
Perlでこれを行うにはどうすればよいですか?
16 進文字列 (長さ 48 文字) をパック関数でraw バイトに変換して、バイトの Win32 ベクトルに入れたいと考えています。
Perlでこれを行うにはどうすればよいですか?
my $bytes = pack "H*", $hex;
詳細については、 perlpacktutを参照してください。
手順は次のとおりです。
例えば:
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);
私は文字列を持っています:
" 61 62 63 64 65 67 69 69 6a
"
これを16進値として解釈し、それらを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
...そして、なぜ1文字しか返されないのだろうか:)
まず、私が持っている文字列は、メモリ内で使用するバイトの 16 進値として表すこともできることに注意してください。
$ 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: 基本的に、16 進ダンプで表示した場合、メモリ内の上記のバイト値を入力としてこれらの下のバイト値に「変換」したい:
$ echo -n "abcdefghij" | hexdump -C
00000000 61 62 63 64 65 66 67 68 69 6a |abcdefghij|
0000000a
...これが、入力された 16 進文字列の元の値が取得された方法です。)_
さて、このPack/Unpack Tutorial (別名How the System Stores Data )は、次のように述べているように、私にとって最も役に立ちます。
pack 関数は、テンプレート文字列と値のリストを受け入れます [...]
$rec = pack( "l i Z32 s2", time, $emp_id, $item, $quan, $urgent);
テンプレートで指定された形式に従って格納された値のリストを含むスカラーを返します [...]
$rec
次のものが含まれます (最初の行は 10 進数、2 番目は 16 進数、3 番目は該当する文字として)。パイプ文字はフィールド境界を示します。Offset Contents (左から右にアドレスを増やす) 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 | | ボックスの
つまり、私の場合、$_
単一の文字列変数です-一方、入力として、そのような「単一の」変数のリスト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
指定する必要があります (そうしないと、ここでも 1 文字しか返されません); 次に、これらの代替手段のいずれかが機能します。
$ 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