Преобразование двоичных (RAW) данных в текстовый шестнадцатеричный формат.
Задача, которую мне поставил клиент, была такая - преобразовать бинарный файл в текст, который можно распечатать и переслать по почте. Чтоб его можно было сканером распознать, и обратно в бинарный файл преобразовать. Ну очень плохо ходят флэшки, и тем более, криптостойкие донглы промеж границ из-за Хуйла, сами понимаете.
Пример тестового бинарного файла (в Linux):
В Windows:
Понятно, что напечатать это нельзя, для распечатки надо преобразовать бинарный RAW-формат в что-то удобопечатоемое, например в строки, содержащие шестнадцатеричные цифры:
EA 38 B6 C1 18 1A 4F B3 5F 81 B7 A4 1B 50 89 18 B3 0B 24 27 36 59 57 D0 3A 78 1C
3E D6 F2 27 01 13 4B 54 65 6E 44 61 23 7D D4 ED 60 CE 8E C1 A2 58 45 BB 35 84 A7
69 28 D4 09 5F 99 F5 27 CA 30
В Linux есть сразу несколько инструментов, позволяющих выполнить дамп файла в набор шестнадцатеричных значений, причем "из коробки". Не зря же эта ОС изначально писалась программистами для программистов.
Кратко ознакомиться с этими инструментами можно здесь:
Convert Binary Data to Hexadecimal (оригинал статьи на буржуйском)
Преобразование двоичных данных в шестнадцатеричный формат (Перевод на русский, PDF)
Я воспользовался утилитой
hexdump
, и написал небольшой скрипт, который при вызове его с параметром, содержащим путь к файлу, создает в каталоге с оригинальным файлом файл имя_оригинального_файла.dump
, который содержит шестнадцатеричное представление исходного файла:dumpfile <имя_файла>
Основной алгоритм укладывается в одну строку:
cat $1|hexdump -e '27/1 "%02X " "\n"' >$1.dump
1. Читаем файл, переданный на вход скрипта командой
cat
.2. Передаем в pipe (
|
) данные hexdump
'у3. Скидываем вывод (
>
) в файл $1.dump
Скрипт на GitHub
В винде, как обычно - в таких случаях все через жопу, слава Ктулху, нашлись умные люди, которые все сделали за меня на BAT/CMD и доступном в системе JScript.
Совместимость - начиная с Windows XP
HEXDUMP [/Опция [Значение]]...
Записывает содержимое стандартного ввода в шестнадцатеричном виде в стандартный вывод, по 16 байт на строку, используя следующий формат:
ООООООО ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ААААААААААААААААА
где:
0000000
= шестнадцатеричное смещение в пределах файлаXX
= шестнадцатеричное значение байтаAAAAAAAAAAAAAAAA
= байты в формате ASCII (управляющие коды и не-ASCII в виде .
[символ точка])Вывод кодируется как ASCII, каждая строка завершается символом CarriageReturn - перевод строки.
Поведение можно изменить, добавив любую комбинацию следующих параметров:
-
/I InFile
— ввод из InFile
вместо стандартного ввода-
/O OutFile
— вывод в OutFile
вместо stdout: — перезаписывает InFile
-
/NA
- отключить вывод ASCII-символов.-
/NO
- отключить вывод смещений-
/R
- Необработанный шестнадцатеричный код в одной строке без пробелов между байтами.-
/LF
- LineFeed как признак конца строки (UNIX-формат) вместо CarriageReturn LineFeed (по умолчанию, формат Windows)-
/NL
- без разделителей строк, весь вывод в одной строке без разделителей строк-
/U
- вывод в кодировке Unicode с BOM (UTF-16)-
/V
- Вывести информацию о версии-
/?
- Вывести эту справкуHEXDUMP.BAT
версии 2.1
был написан Дэйвом Бенхамом.и поддерживается на https://www.dostips.com/forum/viewt
Вывод в файл (пример):
hex_dump.bat /I test.temp /O test.temp.dump /NA /NO
Вывод на консоль:
hex_dump.bat /I test.temp /NA /NO
Пример вывода на консоль:
60 ab 2b b8 4a 3f 0d 91 a0 a4 09 f0 8f 4b 51 95
3a 22 1b 0e 5b 6d d0 3f 80 96 c5 22 98 dc 4a 2b
89 38 52 96 42 c0 ab 04 c4 8e b8 87 dd 7c 4a b2
e1 6a b1 c2 30 66 82 54 21 5a 40 a2 bb f8 19 89
С GitHub
Перевод помощи к скрипту
Источник
Это репост с сайта http://tolik-punkoff.com
Оригинал: https://tolik-punkoff.com/2023/07/25/pre