13

16 進文字列 (長さ 48 文字) をパック関数でraw バイトに変換して、バイトの Win32 ベクトルに入れたいと考えています。

Perlでこれを行うにはどうすればよいですか?

4

3 に答える 3

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

詳細については、 perlpacktutを参照してください。

于 2010-03-11T18:43:47.793 に答える
8

手順は次のとおりです。

  1. 文字列から 16 進文字のペアを抽出します。
  2. 各ペアを 10 進数に変換します。
  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);
于 2010-03-11T18:42:29.027 に答える
1

私は文字列を持っています:

" 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
于 2012-10-26T08:27:10.090 に答える