Использование hexdump для вывода только ASCII
Я пытаюсь вывести значения ASCII, соответствующие некоторым двоичным данным. Я успешно применил утилиту hexdump
для вывода hexdump и ASCII бок о бок, как показано ниже:
00000120 20 20 20 20 3d 20 30 78 30 30 30 30 30 30 33 30 | = 0x00000030|
00000130 0a 01 00 00 00 23 00 00 00 75 75 69 64 30 20 20 |.....#...uuid0 |
00000140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d | =|
00000150 20 30 78 39 30 38 32 61 63 35 61 0a 01 00 00 00 | 0x9082ac5a.....|
00000160 23 00 00 00 75 75 69 64 31 20 20 20 20 20 20 20 |#...uuid1 |
00000170 20 20 20 20 20 20 20 20 20 20 3d 20 30 78 37 34 | = 0x74|
00000180 61 37 34 37 36 66 0a 01 00 00 00 23 00 00 00 75 |a7476f.....#...u|
00000190 75 69 64 32 20 20 20 20 20 20 20 20 20 20 20 20 |uid2 |
000001a0 20 20 20 20 20 3d 20 30 78 61 32 35 35 35 63 30 | = 0xa2555c0|
Однако, я хотел бы видеть только ASCII как выходные значения. Меня не интересуют шестнадцатеричные значения. Например, выход должен быть следующий (примерно соответствующий выше):
= 0x00000030.....#...
uuid0=0x9082ac5a.....
uuid1=0x74a7476f
(для этого я не смог использовать переключатели hd
.)
Ответы
Ответ 1
Если вам нужно только увидеть текстовое содержимое двоичного файла, строки должны быть полезны:
Для каждого указанного файла GNU strings
печатает символ печати последовательности длиной не менее 4 символов (или число, указанное с опцией -n
), за которым следует непечатаемый символ. strings
в основном полезен для определения содержимого нетекстового файлы.
Ответ 2
В то время как ответ от raina77ow о команде strings(1)
- это правильный способ получить желаемый результат, конкретный запрос на использование hexdump(1)
, чтобы отфильтровать только печатные символы могут иметь смысл в некоторых контекстах. Я отвечу на это специально здесь.
Утилита hexdump оказывается в состоянии, обеспечивающем потрясающе обобщенное форматирование. Это, вероятно, было сделано для того, чтобы сделать реализацию различных выбираемых форматов более однородной. Если ваша копия hexdump предоставляет этот движок (как многие из них) с помощью командной строки -e
, то вы действительно можете заставить его делать то, что вы просили.
Ключ - это параметр -e
и язык форматирования, который он поддерживает. Этот язык позволяет специфицировать строки формата, которые потребляют байты ввода и создают текст. Команда, например:
$ hexdump -e "16 \"%_p\" \"\\n\"" hexdump.exe | head -16
будет потреблять 16 байт за раз, отображать их в формате %_p
и добавлять новую строку после каждого 16-го байта. Каждый непечатаемый символ заменяется на .
на выходе.
Другими характерными форматами для рассмотрения являются %_c
и %_u
. Первый заменяет непечатаемый символ своей escape-последовательностью ANSI-C или трехзначным восьмеричным номером. Второй заменяет непечатать каждый символ обычным именем управляющего символа ASCII или двухзначным шестнадцатеричным числом.
Если в вашей копии hexdump
отсутствует опция -e
или она медленная, или вам вообще не хватает реализации hexdump
, то недавно лицензированная, быстрая и разумно переносимая реализация hexdump
в последнее время выпущенный William Ahern, стоит посмотреть. Он должен строить для множества Unix-подобных систем из коробки, и с небольшими изменениями, которые он создает с помощью MingW GCC в Windows. Ключевым атрибутом этой реализации является то, что один исходный файл может быть создан как разделяемая библиотека для включения в другую программу, как модуль Lua для использования из Lua, а также автономный исполняемый файл, реализующий команду hexdump
.
Ответ 3
вы можете использовать od:
od -t c file
Или awk
с hexdump
следующим образом:
hexdump -C file | awk '{for(i=NF; i>17; --i) print $i}'
Примечание: вам нужно изменить команду awk, если вы измените количество столбцов в hexdump.
Ответ 4
hexdump -C file /dev/sda4|cut -c 62-77
Надеюсь, что это поможет