XXD(1)

НАЗНАЧЕНИЕ
Программа xxd — выполняет преобразование данных или в шестнадцатеричный вид, или выполняет обратное преобразование из шестнадцатеричного кода в исходный формат

КРАТКИЙ ОБЗОР
xxd -h[elp]
xxd [аргументы] [входной_файл [выходной_файл]]
xxd -r[evert] [аргументы] [входной_файл [выходной_файл]]

ОПИСАНИЕ
Программа xxd создаёт представление указанного файла или данных, прочитанных из стандартного потока ввода, в виде шестнадцатеричных кодов. Эта программа также может выполнять обратное преобразование заданных шестнадцатеричными кодами данных в исходный двоичных формат. Подобно программам uuencode(1) и uudecode(1) , она позволяет выполнять преобразование двоичных данных в символы кодировки ASCII, которые можно передавать по электронной почте, однако, помимо этого, программа xxd позволяет выполнять декодирование в поток стандартного вывода, а также может применяться для создания исправлений для двоичных файлов.

АРГУМЕНТЫ КОМАНДНОЙ СТРОКИ
Если входной_файл не задан, то требуемые данные считываются из стандартного потока ввода. В случае, если в качестве входного_файла используется символ '-', источником данных также выступает стандартный поток ввода. В том случае, если не указан выходной_файл (или вместо него используется символ '-' ), результат преобразования направляется в стандартный поток вывода.

Обратите внимание, что применяется "ленивый" алгоритм разбора аргументов, который проверяет только первую букву аргумента, если, конечно, для этого аргумента не указано какое-то значение. Пробелы между односимвольным аргументом и его значением не являются обязательными. Значения аргументов могут быть заданы в десятичном, шестнадцатеричном или восьмеричном формате. Таким образом, аргументы -c8, -c 8, -c 010 и -cols 8 являются равнозначными.

-a | -autoskip
    Включить автоматический пропуск, т. е., вместо нескольких идущих подряд строк с нулевым значением, используется одиночный символ '*'. По умолчанию не применяется.

-b | -bits
    Использовать биты (двоичный код), а не шестнадцатеричные цифры. При указании этого аргумента, вместо обычного шестнадцатеричного представления октетов, будет отображается набор из восьми цифр "1" и "0". Каждая строка предваряется её номером в шестнадцатеричном виде, а завершается в виде символов в кодировке ASCII (или в кодировке EBCDIC). Аргументы командной строки -p, -i в этом режиме не применяются.

-c кол | -cols кол
    Задаёт количество октетов <кол>, которое выводится на каждой строке. По умолчанию используется значение 16 (для аргумента -i используется 12, для -ps — 30, для -b — 6). Максимально допустимое значение — 256. Максимальное значение не применяется с аргументом -ps. Если с аргументом -ps, указано значение 0, то будет выведена просто одна длинная строка.

-C | -capitalize
    Преобразовать наименования переменных в верхний регистр при использовании стиля отображения в виде подключаемых файлов языка Си, который включается через аргумент командной строки -i.

-d  Отображать смещение не в шестнадцатеричном, а в десятичном формате.

-E | -EBCDIC
    Отображать символы в крайне правой колонке не в кодировке ASCII, а в кодировке EBCDIC. Этот аргумент не влияет на шестнадцатеричное представление данных. Данный аргумент не имеет смысла, если используются аргументы командной строки -r, -p или -i.

-e  Использовать обратный порядок байт при отображение шестнадцатеричного представления данных. Группа байт будет показана как двоичное слово от младших разрядов к старшим. Используемое по умолчанию группирование по четыре байта может быть изменено через аргумент командной строки -g. Действие этого аргумента распространяется только на шестнадцатеричное представление данных и не оказывает влияние на символьное представление в кодировке ASCII (или EBCDIC). Аргументы командной строки -r, -p, -i не применяются в этом режиме.

-g байт | -groupsize байт
    Выполнить группирование указанного количества <байт> (две шестнадцатеричные цифры или восемь двоичных цифр), отделяя группы друг от друга пробелами. Значение -g 0 применяется для отказа от использования группирования. По умолчанию используется значение <байт>, равное 2 при отображении в прямом порядке байт, 4 при отображении в обратном порядке байт и 1 в двоичном режиме. Группировка не применяется в режиме PostScript или include.

-h | -help
    Показать краткую информацию об аргументах командной строки и завершить работу программы. Создание шестнадцатеричного представления не выполняется.

-i | -include
    Создавать вывод в стиле подключаемых заголовочных файлов языка Си. Вывод содержит полноценное определение статического массива данных, название которого соответствует наименованию входного файла, если программа xxd не считывает данные из стандартного потока ввода.

-l длина | -len длина
    Указывает, что после записи заданного в параметре <длина> количества октетов, работа программы будет завершена.

-n название  |  -name название
    Изменить возвращаемое наименование переменной при использовании аргумента -i. Применяется к массиву байт, который будет именоваться как название и длина файла как название_len.

-o смещение
    Указывает добавить <смещение> в отображаемую позицию файла.

-p | -ps | -postscript | -plain
    Использовать непрерывный формата вывода шестнадцатеричного кода, известного как "простой" стиль или стиль "PostScript".

-r | -revert
    Выполнить операцию обратного преобразования, т. е. преобразование шестнадцатеричного представления в двоичный код (или применить результат в качестве исправления). Если вывод происходит не в стандартного поток вывода, то программа xxd выполняет добавление кода к выходному файлу. При использовании комбинации аргументов -r -p происходит чтение "простого" шестнадцатеричного представления без использования информации о номерах строк и какого-либо специального распределения колонок. Пробелы и символы новой строки могут встречаться в любом месте исходных данных. При использовании комбинации аргументов -r -b будет происходить считывание двоичного представления вместо шестнадцатеричного.

-R когда
    В выходных данных одни и те же шестнадцатеричные значения и строковые значения будут подсвечиваться одним и тем же цветом. В основном это помогает различать печатаемые и непечатаемые символы. Где когда может принимать значение never (никогда), always (всегда), или auto (автовыбор, по умолчанию). Если установлена переменная окружения $NO_COLOR , то цветовая подсветка будет отключена.

-seek смещение
    При указании после аргумента -r , будет добавляться указанное <смещение> к файловым позициям, обнаруженным в исходных данных.

-s [+][-]seek
    Начинать обработку с указанного абсолютного (или относительного) <смещения> в байтах во входном_файле. Где + указывает, что смещение является относительным по отношению к текущей позиции данных в стандартном потоке ввода (бессмысленно, если чтение происходит не из стандартного потока ввода). А параметр - указывает, что должно быть прочитано указанное количество символов от конца ввода (либо, если одновременно с параметром +, то перед текущей позицией данных в стандартном потоке ввода). Если аргумент -s не используется, то программа xxd начинает обработку от текущей позиции в файле.

-u  Указывает, что в выводе отображать шестнадцатеричные цифры в верхнем регистре. По умолчанию используются символы в нижнем регистре символов.

-v | -version
    Показать информацию о версии программы и завершить работу.

НЕКОТОРЫЕ РАЗЪЯСНЕНИЯ

При указании команды xxd -r при запуске программы, будет применяться некий встроенный алгоритм для распознавания информации о номерах строк. Если возможен поиск по входному файлу, то номера строк в начале каждой строки шестнадцатеричного представления могут быть неупорядоченными, некоторые строки могут быть пропущены или пересекаться друг с другом. В этих случаях программа xxd использует функцию lseek(2) для перехода к следующей позиции. Если поиск по входному файлу невозможен, то допустимы только пропуски строк, которые заполняются нулевыми байтами.

Использование команды xxd -r приводит к тому, что сообщения об ошибках не будут отображаться. Посторонние данные просто молча пропускаются.

При редактировании шестнадцатеричного представления двоичных файлов, обращайте внимание, что по команде xxd -r , после считывания достаточного количества колонок шестнадцатеричных данных (см. аргумент -c), в строке ввода не будут обрабатываться остальные данные. Это означает, что изменения, внесённые в колонке с текстом в кодировке ASCII (или EBCDIC), всегда игнорируются. При обратном преобразовании шестнадцатеричного представления в стиле PostScript с помощью команды xxd -r -p количество колонок не учитывается. В этом случае распознаются все символы, которые похожи на пары шестнадцатеричных цифр.

Обратите внимание на различие между командами

% xxd -i файл

и

% xxd -i < файл

Команда xxd -s +seek может отличаться от xxd -s seek, поскольку для того, чтобы "отмотать" данные на входе назад, используется вызов функции lseek(2). При указании параметра '+' поведение будет отличаться, если входные данные поступают со стандартного потока ввода, а позиция в файле стандартного ввода не находится в начале файла к тому моменту, когда программа xxd запущена и приступает к чтению ввода. Нижеследующие примеры помогут прояснить (или ещё больше запутать!) ситуацию...

Отмотка потока стандартного ввода назад необходима, поскольку программа 'cat' уже выполнила чтение данных до конца из стандартного потока ввода:

% sh -c "cat > plain_copy; xxd -s 0 > hex_copy" < file

Вывод шестнадцатеричного представления от позиции в файле 0x480 (=1024+128). Параметр '+' означает "относительно текущей позиции", таким образом '128' добавляется к первому килобайту, где завершает работу программа dd:

% sh -c "dd of=plain_snippet bs=1k count=1; xxd -s +128 > hex_snippet" < file

Вывод шестнадцатеричного представления от позиции в файле 0x100 (=1024-768):

% sh -c "dd of=plain_snippet bs=1k count=1; xxd -s +-768 > hex_snippet" < file

В то же время, следует заметить, что подобные ситуации встречаются довольно редко, так что параметр '+' обычно не используется. Автор предпочитает наблюдать за работой программы xxd с помощью инструментов strace(1) или truss(1) в тех случаях, когда применяется аргумент -s.

ПРИМЕРЫ

Вывести всё, кроме первых трёх строк (0x30 байт) файла :
% xxd -s 0x30 file

Вывести три строки (0x30 байт) от конца файла :
% xxd -s -0x30 file

Вывести 120 байт в виде непрерывного шестнадцатеричного представления по 20 октетов в строке
(этот пример для справочника xxd.1 на английском языке, для русского языка будет немного другой результат):
% xxd -l 120 -ps -c 20 xxd.1
2e544820585844203120224d6179203230323422
20224d616e75616c207061676520666f72207878
64220a2e5c220a2e5c222032317374204d617920
313939360a2e5c22204d616e2070616765206175
74686f723a0a2e5c2220202020546f6e79204e75
67656e74203c746f6e79407363746e7567656e2e
Вывести первые 120 байт этого справочника по 12 октетов в строке
(этот пример для справочника xxd.1 на английском языке, для русского языка будет немного другой результат):
% xxd -l 120 -c 12 xxd.1
00000000: 2e54 4820 5858 4420 3120 224d .TH XXD 1 "M
0000000c: 6179 2032 3032 3422 2022 4d61 ay 2024" "Ma
00000018: 6e75 616c 2070 6167 6520 666f nual page fo
00000024: 7220 7878 6422 0a2e 5c22 0a2e r xxd"..\"..
00000030: 5c22 2032 3173 7420 4d61 7920 \" 21st May
0000003c: 3139 3936 0a2e 5c22 204d 616e 1996..\" Man
00000048: 2070 6167 6520 6175 7468 6f72 page author
00000054: 3a0a 2e5c 2220 2020 2054 6f6e :..\" Ton
00000060: 7920 4e75 6765 6e74 203c 746f y Nugent <to
0000006c: 6e79 4073 6374 6e75 6765 6e2e ny@sctnugen.

Показать дату из файла xxd.1
(этот пример для справочника xxd.1 на английском языке, для русского языка будет немного другая команда, например, для UTF-8 — xxd -s 0x50 -l 13 -c 13 xxd.1):

% xxd -s 0x33 -l 13 -c 13 xxd.1
00000033: 3231 7374 204d 6179 2031 3939 36 21st May 1996

Скопировать входной_файл в выходной_файл с добавлением 100 байт со значением 0x00 в начало файла:
% xxd входной_файл | xxd -r -s 100 > выходной_файл
Заменить дату в файле xxd.1
(этот пример для справочника xxd.1 на английском языке, для русского языка будут немного другие команды):

% echo "0000034: 3574 68" | xxd -r - xxd.1
% xxd -s 0x33 -l 13 -c 13 xxd.1
00000033: 3235 7468 204d 6179 2031 3939 36 25th May 1996

Создать 65537-байтный файл, все байты которого имеют значение 0x00, кроме последнего байта, который должен иметь значение 'A' (0x41):

% echo "010000: 41" | xxd -r > file

Создать шестнадцатеричное представление этого файла с использованием автоматического пропуска:

% xxd -a -c 12 file
00000000: 0000 0000 0000 0000 0000 0000 ............
*
0000fffc: 0000 0000 41 ....A

Создать 1-байтный файл, содержащий символ 'A'. Число после аргументов '-r -s' добавляется к номерам строк, найденным в файле, иначе говоря, предшествующие байты пропускаются:

% echo '010000: 41' | xxd -r -s -0x10000 > file

Программу xxd можно использовать в качестве фильтра в редакторе, например в vim(1) , чтобы создать шестнадцатеричное представление области между закладками 'a' и 'z':
:'a,'z!xxd

Можно использовать программу xxd в качестве фильтра в редакторе, например в vim(1) , для восстановления данных из шестнадцатеричного представления между закладками 'a' и 'z':
:'a,'z!xxd -r

Можно использовать программу xxd в качестве фильтра в редакторе, например в vim(1) , для восстановления данных из единственной строки шестнадцатеричного представления. Поместите курсор в соответствующую строку и наберите
!!xxd -r

Чтобы прочитать единственный символ из канала связи:
% xxd -c1 < /dev/term/b &
% stty < /dev/term/b -echo -opost -isig -icanon min 1
% echo -n foo > /dev/term/b

КОДЫ ЗАВЕРШЕНИЯ
При завершении работы, программа xxd возвращает следующие значения:

0   Ошибки не обнаружены.

-1  Операция не поддерживается (выполнение xxd -r -i пока невозможно).

1   Ошибка при разборе аргументов командной строки.

2   Ошибки во входном файле.

3   Ошибки в выходном файле.

4,5 Желательная позиция поиска недостижима.

СМОТРИТЕ ТАКЖЕ
uuencode(1), uudecode(1), patch(1)

ПРЕДУПРЕЖДЕНИЕ
Странность этой программы соответствует особенностям мозга её создателя. Используйте её на свой страх и риск. Копируйте файлы, отслеживайте вызовы, становитесь волшебником.

ВЕРСИЯ
Этот справочник документирует программу xxd версии 1.7 от 2024-05.

АВТОР
(c) Юрген Вайгерт (Juergen Weigert), 1990-1997
<jnweiger@informatik.uni-erlangen.de>

Вы можете свободно распространять программу со ссылкой на меня.
Если использование этой программы принесло вам какой-то доход, поделитесь со мной.
Если вы потеряли деньги, то я тут ни при чём.

Первый вариант справочника написан Тони Наджентом (Tony Nugent)
<tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
Небольшие изменения внесены Брамом Моленаром (Bram Moolenaar). Справочник отредактирован Юргеном Вайгертом (Juergen Weigert).