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). Ключи -r, -p, -i в этом режиме не работают.

-c кол | -cols кол

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

-E | -EBCDIC

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

-g байт | -groupsize байт

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

-h | -help

Выводит справку по доступным ключам командной строки и завершает работу программы. Создание шестнадцатеричного представления не выполняется.

-i | -include

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

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

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

-r | -revert

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

-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 байтов) файла file:

$ xxd -s 0x30 file

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

$ xxd -s -0x30 file

Вывести 120 байтов в виде непрерывного шестнадцатеричного представления по 20 октетов в строке:

$ xxd -l 120 -ps -c 20 xxd.1
2e544820585844203120224d616e75616c207061 676520666f7220787864220a2e5c220a2e5c2220 32317374204d617920313939360a2e5c22204d61 6e207061676520617574686f723a0a2e5c222020 2020546f6e79204e7567656e74203c746f6e7940 7363746e7567656e2e7070702e67752e6564752e

Вывести первые 120 байтов этой страницы справочника по 12 октетов в строке:

$ xxd -l 120 -c 12 xxd.1
0000000: 2e54 4820 5858 4420 3120 224d  .TH XXD 1 "M
000000c: 616e 7561 6c20 7061 6765 2066  anual page f
0000018: 6f72 2078 7864 220a 2e5c 220a  or xxd"..\".
0000024: 2e5c 2220 3231 7374 204d 6179  .\" 21st May
0000030: 2031 3939 360a 2e5c 2220 4d61   1996..\" Ma
000003c: 6e20 7061 6765 2061 7574 686f  n page autho
0000048: 723a 0a2e 5c22 2020 2020 546f  r:..\"    To
0000054: 6e79 204e 7567 656e 7420 3c74  ny Nugent <t
0000060: 6f6e 7940 7363 746e 7567 656e  ony@sctnugen
000006c: 2e70 7070 2e67 752e 6564 752e  .ppp.gu.edu.

Показать дату из файла xxd.1:

$ xxd -s 0x28 -l 12 -c 12 xxd.1
0000028: 3231 7374 204d 6179 2031 3939  21st May 199

Скопировать входной_файл в выходной_файл с добавлением 100 байтов со значением 0x00 в начало файла:

$ xxd входной_файл | xxd -r -s 100 > выходной_файл

Заменить дату в файле xxd.1:

$ echo '0000029: 3574 68' | xxd -r - xxd.1
$ xxd -s 0x28 -l 12 -c 12 xxd.1
0000028: 3235 7468 204d 6179 2031 3939  25th May 199

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

$ echo '010000: 41' | xxd -r > file

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

$ xxd -a -c 12 file
0000000: 0000 0000 0000 0000 0000 0000  ............
*
000fffc: 0000 0000 40                   ....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 Желательная позиция поиска недостижима.

ПРЕДУПРЕЖДЕНИЕ


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

ВЕРСИЯ


Эта страница справочника документирует xxd версии 1.7.

АВТОР


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

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

Если вы потеряли деньги, то я тут не причём.

Первый вариант страницы справочника написан Тони Наджентом (Tony Nugent)

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

Ctrl
Enter
Заметили ошЫбку
Выделите текст и нажмите Ctrl+Enter
1 533
0
00