我正在尝试输出与某些二进制数据相对应的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
的开关。)
答案 0 :(得分:33)
如果您只需要查看二进制文件的文本内容,strings应该是有用的:
对于给定的每个文件,GNU
strings
打印可打印字符 长度至少为4个字符的序列(或给定的数字 使用-n
选项)后跟一个不可打印的字符。strings
主要用于确定非文本内容 文件。
答案 1 :(得分:8)
虽然关于strings(1)
命令的answer from raina77ow是获得您真正想要的结果的正确方法,但使用hexdump(1)
过滤掉仅可打印字符的具体请求可能有意义一些情况。我会在这里特别回应。
hexdump实用程序证明支持一个惊人的通用格式引擎。这可能是为了使各种可选格式的实现更加统一。如果你的hexdump副本通过-e
命令行选项公开了那个引擎(那么多),那么你实际上可以让它按照你的要求进行。
关键是-e
选项及其支持的格式化语言。该语言允许指定消耗输入字节并生成文本的格式字符串。命令如:
$ hexdump -e "16 \"%_p\" \"\\n\"" hexdump.exe | head -16
一次消耗16个字节,通过%_p
格式显示,并在每个第16个字节后添加换行符。每个不可打印的字符在输出中替换为.
。
要考虑的其他面向字体的格式为%_c
和%_u
。第一个用其ANSI-C转义序列替换非打印字符,或用三位八进制数替换非打印字符。第二个用ASCII控制字符的常规名称或两位十六进制数字替换非打印每个字符。
如果您hexdump
的副本缺少-e
选项,或者速度很慢,或者您根本没有hexdump
的实现,那么这是一个自由许可,快速且合理的便携式实现hexdump
最近released by William Ahern值得关注。它应该为许多类似Unix的系统提供开箱即用的功能,并且只需要在Windows上使用MingW GCC进行微调。此实现的一个关键属性是单个源文件可以构建为共享库以包含在另一个程序中,作为用于Lua的Lua模块,以及实现hexdump
的独立可执行文件。 }命令。
答案 2 :(得分:7)
您可以使用od:
od -t c file
或awk
hexdump
如此:
hexdump -C file | awk '{for(i=NF; i>17; --i) print $i}'
注意:如果更改hexdump中的列数,则必须更改awk命令。