← Весь справочник

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
-elittle-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 x1hex по байту — самый понятный вариант; 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