这篇文章主要为大家展示了“Hexdump怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Hexdump怎么用”这篇文章吧。

hexdump是Linux下的一个二进制文件查看工具,它可以将二进制文件转换为ASCII、八进制、十进制、十六进制格式进行查看。

学习基本用法

Hexdump 让你毫不费力地得到输出结果,依你所查看文件的尺寸,输出结果可能会非常多。本文中我们会创建一个 1×1 像素的 PNG 文件。你可以用图像处理应用如 GIMP 或 Mtpaint 来创建该文件,或者也可以在终端内用 ImageMagick 创建。

用 ImagiMagick 生成 1×1 像素 PNG 文件的命令如下:

$convert-size1x1canvas:blackpixel.png

你可以用 file 命令确认此文件是 PNG 格式:

$filepixel.pngpixel.png:PNGimagedata,1x1,1-bitgrayscale,non-interlaced

你可能好奇 file 命令是如何判断文件是什么类型。巧的是,那正是 hexdump 将要揭示的原理。眼下你可以用你常用的图像查看软件来看看你的单一像素图片(它看上去就像这样:.),或者你可以用 hexdump 查看文件内部:

$hexdumppixel.png00000005089474e0a0d0a1a00000d004849524400000100000010000000100000100003700f96e00000200024000067044d410041b1000b8f61fc00000300005000063205248004d7a000026800000000400084fa000000800000e875000030ea00000005000603a00009817009c7051ba003c000000000606202474b0044dd01138a00a40000740700000704d49074507e3081a3539a48746b0000000000800a0044495441d7086063000002000100000009021e233bc00002500457474586164657400000a0633a65727461006530323931302d2d3700000b0353232543a303735353a2b333231303a00000c0ac305dcd00c10000742558456474746100000d03a656f6d69647966320031302d39373000000e0322d54353032353a3a373335312b3a3200000f0303090dd7de5000000004549444e42ae000010082600000102

透过一个你以前可能从未用过的视角,你所见的是该示例 PNG 文件的内容。它和你在图像查看软件中看到的是完全一样的数据,只是用一种你或许不熟悉的方式编码。

提取熟悉的字符串

尽管默认的数据输出结果看上去毫无意义,那并不意味着其中没有有价值的信息。你可以用 –canonical 选项将输出结果,或至少是其中可翻译的部分,翻译成更加熟悉的字符集:

$hexdump--canonicalfoo.png0000000089504e470d0a1a0a0000000d49484452|.PNG........IHDR|0000001000000001000000010100000000376ef9|.............7n.|00000020240000000467414d410000b18f0bfc61|$....gAMA......a|0000003005000000206348524d00007a26000080|....cHRM..z&...|00000040840000fa00000080e8000075300000ea|...........u0...|000000506000003a98000017709cba513c000000|`..:....p..Qcd5dc10000002574455874646174|0..]....%tEXtdat|000000d0653a6d6f6469667900323031392d3037|e:modify.2019-07|000000e02d32355432303a35373a35332b31323a|-25T20:57:53+12:|000000f03030dd90e57d0000000049454e44ae42|00...}....IEND.B|000001006082|`.|00000102

在右侧的列中,你看到的是和左侧一样的数据,但是以 ASCII 码展现的。如果你仔细看,你可以从中挑选出一些有用的信息,如文件格式(PNG)以及文件创建、修改日期和时间(向文件底部寻找一下)。 file 命令通过头 8 个字节获取文件类型。程序员会参考 libpng 规范 来知晓需要查看什么。具体而言,那就是你能在该图像文件的头 8 个字节中看到的字符串 PNG。这个事实显而易见,因为它揭示了 file 命令是如何知道要报告的文件类型。 你也可以控制 hexdump 显示多少字节,这在处理大于一个像素的文件时很实用:

$hexdump--length8pixel.png00000005089474e0a0d0a1a0000008

hexdump 不只限于查看 PNG 或图像文件。你也可以用 hexdump 查看你日常使用的二进制文件,如 ls、rsync,或你想检查的任何二进制文件。

用 hexdump 实现 cat 命令

阅读 PNG 规范的时候你可能会注意到头 8 个字节中的数据与 hexdump 提供的结果看上去不一样。实际上,那是一样的数据,但以一种不同的转换方式展现出来。所以 hexdump 的输出是正确的,但取决于你在寻找的信息,其输出结果对你而言不总是直接了当的。出于这个原因,hexdump 有一些选项可供用于定义格式和转化其转储的原始数据。 转换选项可以很复杂,所以用无关紧要的东西练习会比较实用。下面这个简易的介绍,通过重新实现 cat 命令来演示如何格式化 hexdump 的输出。首先,对一个文本文件运行 hexdump 来查看其原始数据。通常你可以在硬盘上某处找到 GNU 通用许可证GNU General Public License(GPL)的一份拷贝,也可以用你手头的任何文本文件。你的输出结果可能不同,但下面是如何在你的系统中找到一份 GPL(或至少其部分)的拷贝:

$find/usr/share/doc/-typef-name"COPYING"|tail-1/usr/share/doc/libblkid-devel/COPYING

对其运行hexdump:

$hexdump/usr/share/doc/libblkid-devel/COPYING0000000685473696c20626961727972692020730000010726665657320666f777472613b6579200000020756f63206e617220646573697274626900000307475206574696120646e6f2f0a726f6d000004069647966692020746e756564207268740000050206565746d722073666f7420656847200000060554e4c207365657320726547656e61720000070206c75506c6263694c0a63696e65657300000806120207375706c627369656820647962[...]

如果该文件输出结果很长,用 –length(或短选项 -n)来控制输出长度使其易于管理。 原始数据对你而言可能没什么意义,但你已经知道如何将其转换为 ASCII 码:

hexdump--canonical/usr/share/doc/libblkid-devel/COPYING0000000054686973206c69627261727920697320|Thislibraryis|000000106672656520736f6674776172653b2079|freesoftware;y|000000206f752063616e20726564697374726962|oucanredistrib|0000003075746520697420616e642f6f720a6d6f|uteitand/or.mo|000000406469667920697420756e646572207468|difyitunderth|0000005065207465726d73206f66207468652047|etermsoftheG|000000604e55204c65737365722047656e657261|NULesserGenera|000000706c205075626c69630a4c6963656e7365|lPublic.License|[...]

这个输出结果有帮助但太累赘且难于阅读。要将 hexdump 的输出结果转换为其选项不支持的其他格式,可组合使用 –format(或 -e)和专门的格式代码。用来自定义格式的代码和 printf 命令使用的类似,所以如果你熟悉 printf 语句,你可能会觉得 hexdump 自定义格式不难学会。 在 hexdump 中,字符串 %_p 告诉 hexdump 用你系统的默认字符集输出字符。–format 选项的所有格式符号必须以单引号包括起来:

$hexdump-e'"%_p"'/usr/share/doc/libblkid-devel/COPYINGThislibraryisfre*software;youcanredistributeitand/or.modifyitunderthetermsoftheGNULes*erGeneralPublic.LicenseaspublishedbytheFre*SoftwareFoundation;either.version2.1oftheLicense,or(atyouroption)anylater.version..*Thecompletetextofthelicenseisavailableinthe..*/Documentation/licenses/COPYING.LGPL-2.1-or-laterfile..

这次的输出好些了,但依然不方便阅读。传统上 UNIX 文本文件假定 80 个字符的输出宽度(因为很久以前显示器一行只能显示 80 个字符)。

尽管这个输出结果未被自定义格式限制输出宽度,你可以用附加选项强制 hexdump 一次处理 80 字节。具体而言,通过 80 除以 1 这种形式,你可以告诉 hexdump将 80 字节作为一个单元对待:

$hexdump-e'80/1"%_p"'/usr/share/doc/libblkid-devel/COPYINGThislibraryisfreesoftware;youcanredistributeitand/or.modifyitunderthetermsoftheGNULesserGeneralPublic.LicenseaspublishedbytheFreeSoftwareFoundation;either.version2.1oftheLicense,or(atyouroption)anylater.version...Thecompletetextofthelicenseisavailableinthe.../Documentation/licenses/COPYING.LGPL-2.1-or-laterfile..

现在该文件被分割成 80 字节的块处理,但没有任何换行。你可以用 \n 字符自行添加换行,在 UNIX 中它代表换行:

$hexdump-e'80/1"%_p""\n"'Thislibraryisfreesoftware;youcanredistributeitand/or.modifyitunderthetermsoftheGNULesserGeneralPublic.LicenseaspublishedbytheFreeSoftwareFoundation;either.version2.1oftheLicense,or(atyouroption)anylater.version...Thecompletetextofthelicenseisavailableinthe.../Documentation/licenses/COPYING.LGPL-2.1-or-laterfile..

现在你已经(大致上)用 hexdump 自定义格式实现了 cat 命令。 控制输出结果 实际上自定义格式是让 hexdump 变得有用的方法。现在你已经(至少是原则上)熟悉 hexdump 自定义格式,你可以让 hexdump -n 8 的输出结果跟 libpng 官方规范中描述的 PNG 文件头相匹配了。

首先,你知道你希望 hexdump 以 8 字节的块来处理 PNG 文件。此外,你可能通过识别这些整数从而知道 PNG 格式规范是以十进制数表述的,根据 hexdump 文档,十进制用 %d 来表示:

$hexdump-n8-e'8/1"%d""\n"'pixel.png13780787113102610

你可以在每个整数后面加个空格使输出结果变得完美:

$hexdump-n8-e'8/1"%d""\n"'pixel.png13780787113102610

现在输出结果跟 PNG 规范完美匹配了。

以上是“Hexdump怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!