Здесь приведен перевод документации для xxd версии 1.7. Утилита делает текстовый дамп двоичного файла, или делает обратное преобразование - из текстового дампа в двоичный файл.
xxd -h[elp] xxd [options] [infile [outfile]] xxd -r[evert] [options] [infile [outfile]]
[Описание]
Программа xxd создает hex-дамп указанного файла или стандартного консольного ввода (standard input). Она также может преобразовать hex-дамп обратно в оригинальный двоичный файл. Наподобие uuencode(1) и uudecode(1) утилита позволяет передавать двоичные данные в подходящем для электронной почты текстовом представлении (в кодировке ASCII), однако достоинство xxd в том, что есть возможность стандартного вывода. Кроме того, xxd можно использовать для патча двоичного файла.
[Опции]
Если входной файл (infile) не указан, то для чтения входных данных используется стандартный ввод (standard input). Если infile указан как символ '-' то ввод производится также из стандартного ввода консоли (standard input). Если не указан выходной файл (outfile), или вместо него указан символ '-', то программа посылает результат перекодирования в стандартный вывод, т. е. окно консоли (standard output).
Обратите внимание, что используется "ленивый" (lazy) парсер, который не ролвеояет больше одной первой буквы опции, за исключением тех опций, за которой идет параметр опции. Пробел между буквой опции и параметром не обязателен. Параметры для опций могут быть указаны в десятичной, шестнадцатеричной или восьмеричной нотации. Таким образом, варианты опции -c8, -c 8, -c 010 и -cols 8 все будут экивалентны друг другу.
-a | -autoskip
Переключает режим автопропуска: одиночный символ * заменит пустые строки. По умолчанию выключено.
-b | -bits
Переключится из hex-дампа на бинарный (где используются только символы '0' и '1') дамп. Эта опция записывает октеты как восемь символов из "1" и "0" вместо обычных обозначающих тетрады шестнадцатеричных цифр. В начале каждой строки стоит номер строки в шестнадцатеричном виде, за которым идет ascii (или ebcdic) текстовое представление данных. В этом режиме не работают опции -r, -p, -i.
-c cols | -cols cols
Задает формат строки, сколько октетов помещать в строку. По умолчанию 16 (-i: 12, -ps: 30, -b: 6). Можно указать максимальное значение 256.
-E | -EBCDIC
Изменит кодирование символов в правом столбце из ASCII на EBCDIC. Это никак не повлияет на hex-представление данных. Опция имеет значение в комбинации с опциями -r, -p или -i.
-g bytes | -groupsize bytes
Отделит пробелом вывод для каждого байта группами по количеству bytes (2 hex-символа или 8 двоичных символов). Если указать -g 0, то это подавит группирование. По умолчанию для bytes задано значение 2 в нормальном hex-режиме и 1 в двоичном режиме. Группирование не влияет на стиль postscript или стиль include.
-h | -help
Печатает краткую справку по командам, и больше ничего. Не будет выполнено преобразование для дампа.
-i | -include
Выведет дамп в стиле подключаемого файла (для директивы #include) языка C. Данные входного файла будет записаны полностью в определение статического массива (который получит имя по входному файлу, если xxd не читает из stdin).
-l len | -len len
Остановит работу после вывода < len > октетов.
-p | -ps | -postscript | -plain
Выведет текст в стиле непрерывного postscript hex-дампа. Этот стиль также известен как plain hexdump.
-r | -revert
Обратная операция: конвертирует (или делает patch) hex-дамп в двоичный файл. Если не делается вывод в stdout, xxd записывает вывод в выходной файл без его обрезки. Используйте комбинацию -r -p для чтения сплошных (plain) шестнадцатеричных дампов без информации о номерах строк и без специального разбиения по колонкам. В любом месте входного текста разрешены пробелы и символы возврата строки и перевода каретки (CR, LF).
-seek offset
Когда используется после -r: делает обратное преобразование с позиции < offset > файла, чем данные добавляются в те места двоичного файла, которые найдены во входном hex-дампе. Применяется для патча (т. е. исправления) двоичных файлов.
-s [+][-]seek
Начинает с позиции < seek > байт, позиция абсолютная abs. (или относительная rel.) в файле infile. Символ + показывает, что позиционирование seek будет относительно текущей позиции файла (это бессмысленно, когда чтение происходит не из stdin). Символ - показывает, что позиционирование seek должно начаться от указанного количества байт от конца файла ввода (или если это комбинировано с +: перед текущей позицией файла stdin). Без опции -s утилита xxd начнет работу с текущей позиции файла.
[Подробности по использованию]
Запуск xxd -r имеет некую встроенную магию, используемую при обработки информации в строке. Если по выходному файлу можно производить позиционирование, то номера строк в начале каждой строки hexdump могут идти не по порядку, строки могут отсутствовать, или перекрываться. В этих случаях xxd будет делать lseek(2) в следующую позицию, если по выходному файлу нельзя производить позиционирование, разрешены только пропуски, которые будут заполнены нулевыми байтами.
xxd -r никогда не будет генерировать ошибок парсинга. Мусор молчаливо будет отбрасываться.
Когда Вы редактируете hex-дампы, пожалуйста имейте в виду, что xxd -r пропустит все в строке входного файла после чтения достаточного количества колонок hex-данных (см. опцию -c). Это также означает, что изменения в колонках печатаемого текста ascii (или ebcdic) всегда игнорируются. Возврат к сплошному (plain или postscript) стилю hex-дампа с запуском xxd -r -p не зависит от правильного количества столбцов. Здесь будет интерпретироваться что-то похожее на пару hex-цифр.
Обратите внимание на разницу между
% xxd -i file и % xxd -i < file
Поведение xxd -s +seek может отличаться от xxd -s seek, поскольку для "отматывания" ввода обратно используется lseek(2). Знак '+' делает отличие, если входной источник stdin, и если позиция файла stdin не на начале файла в тот момент, когда запустился xxd и получил свой ввод. Следующие примеры могут помочь сделать пояснения (или еще больше все запутать!)...
Отмотка stdin перед чтением; это нужно потому, что 'cat' уже прочитал до конца stdin.
% sh -c "cat > plain_copy; xxd -s 0 > hex_copy" < file
Hex-дамп от позиции файла 0x480 (=1024+128) onwards. Знак '+' означает "относительно текущей позиции", так что добавится 128 к 1k, где dd закончил работу.
% sh -c "dd of=plain_snippet bs=1k count=1; xxd -s +128 > hex_snippet" < file
Hex-дамп от позиции файла 0x100 ( = 1024-768).
% sh -c "dd of=plain_snippet bs=1k count=1; xxd -s +-768 > hex_snippet" < file
Однако это редкая ситуация, и использование '+' понадобится не часто. Автор всякий раз при использовании -s предпочитает эффект xxd вместе с strace(1) или truss(1).
[Примеры]
Печатает все, кроме первых строк (hex 0x30 байт) файла:
Печать 3 строк (hex 0x30 байт) от конца файла:
Печать 120 байт как непрерывный hex-дамп с 20 октетами на строке:
% xxd -l 120 -ps -c 20 xxd.1
2e54482058584420312022417567757374203139
39362220224d616e75616c207061676520666f72
20787864220a2e5c220a2e5c222032317374204d
617920313939360a2e5c22204d616e2070616765
20617574686f723a0a2e5c2220202020546f6e79
204e7567656e74203c746f6e79407363746e7567
Hex-дамп первых 120 байт этого руководства в 12 октетами на строку:
% xxd -l 120 -c 12 xxd.1
0000000: 2e54 4820 5858 4420 3120 2241 .TH XXD 1 "A
000000c: 7567 7573 7420 3139 3936 2220 ugust 1996"
0000018: 224d 616e 7561 6c20 7061 6765 "Manual page
0000024: 2066 6f72 2078 7864 220a 2e5c for xxd"..\
0000030: 220a 2e5c 2220 3231 7374 204d "..\" 21st M
000003c: 6179 2031 3939 360a 2e5c 2220 ay 1996..\"
0000048: 4d61 6e20 7061 6765 2061 7574 Man page aut
0000054: 686f 723a 0a2e 5c22 2020 2020 hor:..\"
0000060: 546f 6e79 204e 7567 656e 7420 Tony Nugent
000006c: 3c74 6f6e 7940 7363 746e 7567 < tony@sctnug
Отобразить только дату из файла xxd.1:
% xxd -s 0x36 -l 13 -c 13 xxd.1
0000036: 3231 7374 204d 6179 2031 3939 36 21st May 1996
Копировать input_file в output_file ожидая предварительно 100 байт со значением 0x00:
% xxd input_file | xxd -r -s 100 > output_file
Патч даты в файле xxd.1:
% echo "0000037: 3574 68" | xxd -r - xxd.1
% xxd -s 0x36 -l 13 -c 13 xxd.1
0000036: 3235 7468 204d 6179 2031 3939 36 25th May 1996
Создание файла из 65537 байт со всеми байтами в значении 0x00, за исключением последнего байта, который равен 'A' (hex 0x41):
% echo "010000: 41" | xxd -r > file
Hex-дамп этого файла с автопропуском (autoskip):
% 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) для hex--дампа области, помеченной между 'a' и 'z':
Использование xxd в качестве фильтра внутри такого редактора как vim(1) для восстановления двоичного hex-дампа, помеченного между 'a' и 'z'.
Использование xxd в качестве фильтра внутри такого редактора как vim(1) для восстановления одной строки hex-дампа. Переместите курсор через строку и введите:
Чтение символов по одному из последовательной линии связи.
% 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 желаемая позиция seek недостижима.
[Смотри также]
uuencode(1), uudecode(1), patch(1)
Есть порт xxd под Windows, а также другие программы, выполняющие похожие функции [1].
[Автор]
(c) 1990-1997 by 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.
[Ссылки]
1. Утилиты для конвертации двоичных файлов в текст HEX дампа. |