Вопрос

У меня есть шестнадцатеричный дамп из сообщения в файле, который я хочу получить его в массиве, поэтому я могу выполнить логику декодирования на нем.
Мне было интересно, было ли это проще разбирать сообщение, которое выглядит так.

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

Я думаю, что чтение в двух персонажах одновременно является подходящим способом анализа потока, логические токены которого являются двумя символами.

Есть ли почему вы думаете, что это уродливо?

Если вы пытаетесь извлечь конкретную последовательность, вы могли бы сделать это с пробелами, нечувствительными регулярными выражениями.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top