Perl: Как декодировать шестнадцатеричные данные в целое число, строку? - PullRequest
2 голосов
/ 05 декабря 2010

Поддержка У меня есть некоторые шестнадцатеричные необработанные данные, напечатанные с использованием кода c в формате, таком как «% 02X».
так они выглядят так:

\x00\x20\x00\x10\xfd\x02\x10\x00\x00\x00\x00\x20\xff\x02\x10\x00\x00\x00\x00\x00 \x05\x00\x011\x00\x01\x00\n\x00\x0240

Я хочу декодировать их в следующем формате:
Первые два байта шестнадцатеричного «\ x00 \ x20» должны быть расшифрованы в ushort:
Следующие два B hex «\ x00 \ x10» должны быть декодированы в ushort:
Следующий 8-битный шестнадцатеричный код "\ xfd \ x02 \ x10 \ x00 \ x00 \ x00 \ x00 \ x20" должен быть закодирован в 64-битный код Следующий 8-битный шестнадцатеричный код "\ xff \ x02 \ x10 \ x00 \ x00 \ x00 \ x00` \ x00" должен быть закодирован до 64 бит; Следующий 3-байтовый шестнадцатеричный код должен быть декодирован до 3 символов.
....

Как реализовать декодирование в perl
(Кстати, я не понимаю, почему между каждым гексом есть обратная косая черта, это как гекс должен быть распечатан)?

Ответы [ 2 ]

1 голос
/ 05 декабря 2010

s{\\x(..)}{chr hex $1}eg; для одиночных байтов. или просто unpack("v", "\x00\x20"); (подробности см. в функции распаковки).

0 голосов
/ 05 декабря 2010
  1. Расшифруйте данные:
    • s/\\x(..)/chr hex $1/eg/;
    • Еще лучше, если у вас есть контроль над кодом C, который генерирует входные данные, прежде всего заставьте его выводить двоичные данные и полностью исключите этот шаг.
  2. Используйте unpack для декодирования компонентов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...