Задача, которую мне поставил клиент, была такая — преобразовать бинарный файл в текст, который можно распечатать и переслать по почте. Чтоб его можно было сканером распознать, и обратно в бинарный файл преобразовать. Ну очень плохо ходят флэшки, и тем более, криптостойкие донглы промеж границ из-за Хуйла, сами понимаете.
Пример тестового бинарного файла (в 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
В винде, как обычно — в таких случаях все через жопу, слава Ктулху, нашлись умные люди, которые все сделали за меня на 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/viewtopic.php?f=3&t=8816
Вывод в файл (пример):
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