xxd и od
Посмотреть байты файла в hex, восьмеричном и символьном виде; собрать файл обратно из hex-дампа
xxd и od показывают файл побайтно — так видно то, что прячет обычный вывод: \r из Windows, BOM в начале, нулевые байты, лишний перевод строки в конце, кодировку. xxd умеет и обратное: собрать двоичный файл из hex-строки. od (octal dump) есть в любой системе как часть coreutils. В песочнице есть ещё hexdump -C — его вывод похож на xxd.
Синтаксис
xxd [опции] [файл [выходной_файл]]
xxd -r [-p] [файл [выходной_файл]] # обратно: из дампа в байты
od [опции] [файл…]
Без файла обе команды читают стандартный ввод.
Как читать вывод xxd
00000000: 4865 6c6c 6f2c 2057 6f72 6c64 210a 0001 Hello, World!...
└смещение┘ └──── 16 байт в hex, по 2 в группе ────┘ └─ те же байты как текст
- Смещение — номер первого байта строки, в hex:
00000010= 16. - Hex-колонка — каждый байт двумя цифрами:
48=H,0a=\n,0d=\r,00= нулевой байт. - Текстовая колонка — печатные ASCII-символы как есть, всё остальное — точкой.
Опции xxd
Что и сколько показывать
| Опция | Что делает |
|---|---|
-l N | показать только N байт |
-s N | начать с байта N; -s -N — за N байт до конца файла |
-c N | байт в строке (по умолчанию 16; для -p — 30, для -i — 12) |
-g N | байт в группе (по умолчанию 2): -g 1 — по одному, как у hexdump -C |
-a | заменять строки из одних нулей звёздочкой * |
-o N | прибавить N к выводимым смещениям |
-d | смещения в десятичном виде |
Числа в -l, -s, -c, -o можно писать в hex: -s 0x10.
Формат вывода
| Опция | Что делает |
|---|---|
-p | «голый» hex без смещений и текста — удобно для скриптов и копирования; -p -c 0 — всё одной строкой |
-u | заглавные буквы hex: 4C вместо 4c |
-b | двоичный вид: 01001000 вместо 48 |
-e | little-endian: байты внутри группы в обратном порядке (группа по умолчанию 4) |
-i | вывод как массив на языке C (unsigned char имя[] = {0x48, …}); -n имя — имя массива, -C — заглавными |
-R always | раскрашивать вывод (auto — только в терминале, never — нет) |
Обратное преобразование
| Опция | Что делает |
|---|---|
-r | из обычного дампа xxd обратно в байты; текстовая колонка игнорируется |
-r -p | из «голого» hex (48656c6c6f); пробелы и переводы строк в нём допустимы |
-r в существующий файл | если указать выходной файл, он не обрезается: байты пишутся по смещениям из дампа — так «патчат» отдельные байты |
Опции od
Смещения и диапазон
| Опция | Что делает |
|---|---|
-A d / -A x / -A o / -A n | смещения в десятичном / hex / восьмеричном (по умолчанию!) виде / без смещений |
-j N | пропустить первые N байт (можно 0x10, 1K) |
-N N | прочитать не больше N байт |
-w N | байт в строке (по умолчанию 16) |
-v | не схлопывать одинаковые строки в * |
Формат: -t ТИП[РАЗМЕР]
| Тип | Что показывает |
|---|---|
-t x1 | hex по байту — самый понятный вариант; x2, x4 — по 2/4 байта (порядок байт — как у процессора, обычно little-endian) |
-t u1 / -t d1 | беззнаковые / знаковые десятичные числа по байту |
-t o1 | восьмеричные байты |
-t c | символы; спецсимволы — как \n, \t, \0, остальное — восьмеричным кодом (377) |
-t a | имена символов: nl, ht, nul, sp |
-t f4 / -t f8 | числа с плавающей точкой |
-t x1z | добавить справа текстовую колонку >…<, как у xxd |
--endian=big | читать многобайтные числа как big-endian |
Старые короткие формы: -c = -t c, -b = -t o1, -x = -t x2, -d = -t u2. Их можно сочетать: od -bc даёт две строки на каждые 16 байт.
Примеры
printf 'Hello, World!\n\0\1\377' > data.bin
# классический дамп
xxd data.bin
# первые 5 байт / с 7-го байта 5 байт / последние 3 байта
xxd -l 5 data.bin
xxd -s 7 -l 5 data.bin
xxd -s -3 data.bin
# есть ли \r\n и пробелы в конце строки
printf 'line\r\n' | xxd
# BOM в начале UTF-8-файла: ef bb bf
printf '\357\273\277text' | xxd -l 3
# «голый» hex и обратно
echo -n 'hi' | xxd -p # 6869
echo '6869' | xxd -r -p # hi
# поправить один байт в копии файла: сделать дамп, отредактировать, собрать
xxd data.bin > dump.txt
sed -i '1s/^00000000: 48/00000000: 4a/' dump.txt
xxd -r dump.txt > patched.bin
# записать байт по смещению 2 прямо в существующий файл
cp data.bin copy.bin
echo '00000002: 58' | xxd -r - copy.bin
# od: символы, hex по байту без смещений, десятичные коды
od -c data.bin
od -A n -t x1 data.bin
od -A d -t u1 -N 4 data.bin
# hex с текстовой колонкой и десятичными смещениями
od -A d -t x1z data.bin
# 4 случайных байта одной hex-строкой
od -A n -t x1 -N 4 /dev/urandom | tr -d ' \n'; echo
# то же, что xxd -g1, через hexdump
hexdump -C data.bin
Подводные камни
xxd -lне понимает суффиксы.xxd -l 1kпокажет один байт:kмолча отбрасывается. Пиши число полностью (-l 1024) или в hex (-l 0x400). Уod -N 1Kсуффиксы работают.- Смещения в
odпо умолчанию восьмеричные.0000010в начале строки — это байт 8, а не 10. Добавляй-A dили-A x. od -xи-t x2переставляют байты. На little-endian-процессореHiпокажется как6948, а не4869. Для «байт как в файле» бери-t x1(илиxxd, у которого группы читаются слева направо).xxd -rбез-pждёт формат с двоеточием и смещением. «Голый» hex без-pне соберётся:echo 6869 | xxd -rмолча выводит пустоту с кодом 0.xxd -rв существующий файл его не обрезает. Это удобно для патчей, но если нужен файл ровно из дампа — пиши в новый файл или через>.- Многобайтные символы. Буква
ав UTF-8 — два байтаd0 b0, поэтому в текстовой колонкеxxdэто две точки, аod -cпоказывает восьмеричные коды320 260. odиxxdсхлопывают одинаковые строки по-разному:odпо умолчанию заменяет повтор на*,xxd— только с-a. Если считаешь строки дампа, добавьod -v.
См. также
cat и tac · diff, cmp и patch · base64 · iconv · контрольные суммы · dd