Вопрос
У меня есть шестнадцатеричный дамп из сообщения в файле, который я хочу получить его в массиве, поэтому я могу выполнить логику декодирования на нем.
Мне было интересно, было ли это проще разбирать сообщение, которое выглядит так.
37 39 30 35 32 34 35 34 3B 32 31 36 39 33 34 35
3b 32 31 36 39 33 34 36 00 00 01 08 40 00 00 15
6C 71 34 34 73 69 6D 31 5F 33 30 33 31 00 00 00
00 00 01 28 40 00 00 15 74 65 6C 63 6F 72 64 69
74 65 6C 63 6F 72 64 69
Обратите внимание, что данные могут быть максимальными 16 байтами в любой строке. Но любой ряд может содержать меньше байтов (минимум: 1)
Есть ли хороший и элегантный способ, а не читать 2 символа за раз в Perl?
Решение
У Перл есть А. hex
Оператор, который выполняет логику декодирования для вас.
hex EXPR
hex
Интерпретает EXPR как шестигранную строку и возвращает соответствующее значение. (Для преобразования строк, которые могут начать либо с
0
,0x
, или0b
, видетьoct
,) Если expr опущен, использует$_
.print hex '0xAf'; # prints '175' print hex 'aF'; # same
Помните, что поведение по умолчанию split
разбивайте строку на пробелных сепараторах, так, например,
$ perl -le '$ _ = "ABC"; Печать для разделения 'A B C C
Для каждой строки ввода отделите его в шестнадцатеричные значения, преобразуйте значения в номера, а также push
их на массив для последующей обработки.
#! /usr/bin/perl
use warnings;
use strict;
my @values;
while (<>) {
push @values => map hex($_), split;
}
# for example
my $sum = 0;
$sum += $_ for @values;
print $sum, "\n";
Образец запуска:
$ ./sumhex mtanish-вход 4196
Другие советы
Я бы прочитал строку за раз, полосу пробела и использую pack 'H*'
преобразовать его. Трудно быть более конкретным, не зная, какой «логика декодирования» вы пытаетесь подать заявку. Например, вот версия, которая преобразует каждый байт до десятичной:
while (<>) {
s/\s+//g;
my @bytes = unpack('C*', pack('H*', $_));
print "@bytes\n";
}
Выход из вашего файла пример:
55 57 48 53 50 52 53 52 59 50 49 54 57 51 52 53
59 50 49 54 57 51 52 54 0 0 1 8 64 0 0 21
108 113 52 52 115 105 109 49 95 51 48 51 49 0 0 0
0 0 1 40 64 0 0 21 116 101 108 99 111 114 100 105
116 101 108 99 111 114 100 105
Я думаю, что чтение в двух персонажах одновременно является подходящим способом анализа потока, логические токены которого являются двумя символами.
Есть ли почему вы думаете, что это уродливо?
Если вы пытаетесь извлечь конкретную последовательность, вы могли бы сделать это с пробелами, нечувствительными регулярными выражениями.