Вопрос: Как преобразовать 48-шестую строку в байты с помощью Perl?


У меня есть шестнадцатеричная строка (длина 48 символов), которую я хочу преобразовать в необработанные байты с помощью пак  для того, чтобы поместить его в вектор байтов Win32.

Как я могу это сделать с помощью Perl?


6


источник


Ответы:


Шаги:

  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);

4



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

Видеть perlpacktut  Чтобы получить больше информации.


22



У меня есть строка:

" 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: По сути, я хочу «преобразовать» приведенные выше байтовые значения в память в качестве входных данных в эти ниже, если просмотреть hexdump:

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

... так как были получены исходные значения для входной шестнадцатеричной строки.


1