0


Linux 常用命令 - hexdump 【以指定格式显示文件内容】

简介

hexdump

可以将指定文件或标准输入按照指定的格式进行输出,其可以用来查看任何文件的原始数据,在分析非文本文件的场景下非常有用。

使用方式

hexdump [-bcCdovx][-e 指定格式][-f 指定文件][-n 长度][-s 偏移]file...
hd [-bcdovx][-e 指定格式][-f 指定文件][-n 长度][-s 偏移]file...

常用选项

  • -b:将数据按一个字节大小分开以8进制格式显示。每行开头将数据的偏移量按十六进制格式显示,接着显示十六个字节的数据,每个字节用空格分隔,占三列宽度,不足三列的用零填充。
  • -c:将数据按一个字节大小分开以字符格式显示。每行开头将数据的偏移量按十六进制格式显示,接着显示十六个字节的数据,每个字节用空格分隔,占三列宽度,不足三列的用空格填充。
  • -C:将数据按规范的十六进制与 ASCII 混合显示。每行开头将数据的偏移量按十六进制格式显示,接着显示十六个字节的数据,宽度为两列,每个字节用空格分隔,然后再显示对应的十六个字节的 ASCII 字符,用 | 包围。
  • -d:每行显示 8 个数据,每个数据由两个字节组成,以无符号十进制形式表示,每个数据占五列宽度,不足五列用零填充,每个数据之间用空格分隔,每行的开头为十六进制显示的数据偏移。
  • -e format_string:指定一个格式字符串用来显示数据。(下文有详细介绍)
  • -f format_file:指定一个包含格式字符串的文件,hexdump 解析这个文件来显示数据。文件内可以有多个字符串,每个字符串独占一行,空行和以 # 开头的行会被忽略。
  • -n length:指定待处理的数据长度。
  • -o:每行显示 8 个数据,每个数据由两个字节组成,以八进制形式表示,每个数据占六列宽度,不足六列用零填充,每个数据间用空格分隔,每行的开头为十六进制显示的数据偏移。
  • -s offset:跳过 offset 指定的偏移量开始读取数据。默认情况下,offset 被解析为一个十进制数,如果以 0x0X 开头,则被解析为十六进制数;如果以 0 开头,则被解析为八进制数。以偏移量以 b,k,m 结尾依次表示乘以 512,1024,1048576
  • -v:显示所有的输入数据。如果不使用 -v ,则 hexdump 会简化输出,如当遇到两组连续输出的行内容完全相同时,第二组及后续的重复行会被替换为一个仅含有 * 的行。
  • -x:每行显示 8 个数据,每个数据由两个字节组成,以十六进制形式表示,每个数据占四列宽度,不足四列用零填充,每个数据间用空格分隔,每行的开头为十六进制显示的数据偏移。

格式 (Formats)

格式字符串可以包含任意数量的格式单元,使用空格分隔。一个单元包含最多三个部分:迭代计数,字节计数以及格式。

迭代计数是一个可选的正整数,默认为 1。每个格式都会应用相应的次数。

字节计数是一个可选的正整数,如果指定了字节计数,则其将定义每次迭代格式时要解析的字节数。

如果指定了迭代计数或字节计数,则必须在迭代计数或(和)字节计数前加一个

/

来进行区分。并且

/

前后的空白字符会被忽略。

格式部分是必须的,且必须用双引号括起来。格式会被解析为

fprintf

风格的字符串,不过存在以下特殊情况:

  • 不能使用星号 * 作为字段宽度或精度的占位符。
  • 对于每个 s 转换字符,必须指定字节计数或字段精度。
  • 不支持以下转换字符:%hlnpq
  • 支持 C 标准中描述的单字符转义序列: 描述转义序列NUL\0警报字符\a退格\b换页\f换行\n回车\r水平制表符\t垂直制表符\v
hexdump

还支持以下额外的转换字符:

_a[dox]

:显示下一个要显示的字节在输入文件中的偏移量,累计计算所有输入文件的偏移量。追加的字符

d

o

x

分别指定为十进制,八进制或十六进制显示。

_A[dox]

:与

_a

转换字符串相同,但只在所有输入数据处理完后执行一次。

_c

:以默认字符集输出字符。非打印字符显示为三个字符的八进制表示,可以用标准转义符号表示的字符显示为两个字符的字符串。

_p

:以默认字符集输出字符,非打印字符显示为单独的

.

_u

: 输出 US ASCII 字符,控制字符按照以下小写名称显示,大于

0xff

的字符以十六进制字符串显示:

000 NUL  001 SOH  002 STX  003 ETX  004 EOT  005 ENQ
006 ACK  007 BEL  008 BS   009 HT   00A LF   00B VT
00C FF   00D CR   00E SO   00F SI   010 DLE  011 DC1
012 DC2  013 DC3  014 DC4  015 NAK  016 SYN  017 ETB
018 CAN  019 EM   01A SUB  01B ESC  01C FS   01D GS
01E RS   01F US   07F DEL

各转换字符的默认字节计数与其支持的字节计数如下:
转换字符默认及支持的字节计数%_c, %_p, %_u, %c仅支持1字节%d, %i, %o, %u, %X, %x默认4字节, 支持1,2,4字节%E, %e, %f, %G, %g默认8字节,支持4,12字节
每个格式字符串解析的数据量是各个格式单元所需数据量的总和。具体来说,每个格式单元的数据量就等于迭代次数乘以字节计数。如果未指定字节计数,则等于迭代次数乘以该格式单元默认所需要的字节数。

输入数据以 “块” 的形式处理,这个块的大小被定义为任意格式字符串制定的最大数据量。对于解析数据量小于一个输入块的格式字符串,其最后一个格式单元既解析了一些字节数又没有指定迭代次数的情况下,这些格式单元的迭代次数会增加,直到整个输入块都被处理完,或者块中剩余数据不足以满足格式字符串的要求。

如果由于用户指定或者

hexdump

自动修改了迭代次数(如上文所述)而使得迭代次数大于1,则在最后一次迭代时不会输出尾随的空白字符。

当输入数据量不足以满足格式字符串的要求时,

hexdump

会用零填充剩余部分,以便格式字符串能够完整地显示所有可用的数据。

由上述情形导致的额外输出都将被替换为等量的空格。“等量的空格” 是根据原始转换字符或转换字符串(去掉

+

,,

#

这些转换标志)的字段宽度和精度来决定的。

参考示例

1. 以默认形式输出文件内容

hexdump test.c

以默认输出格式显示

test.c

的文件内容:

jay@jaylinuxlenovo:~/test$ hexdump test.c
0000000 6923 636e 756c 6564 3c20 74736964 2e6f
0000010 3e68 230a 6e69 6c63 64752065 733c 7274
0000020 6e69 2e67 3e68 230a 6e69 6c63 64752065
0000030 733c 6474 6e69 2e74 3e68 0a0a 6975 746e
0000040 5f38 207465747473 615f 72727961 5d5b
0000050 3d20 7b20 78303034 202c 78303034 202c
0000060 2c30 3020 3b7d 690a 746e 6d20 6961 286e
0000070 2029 0a7b 20202020 6e69 20742069 203d
0000080 3b30 200a 20206920 746e 6a20 3d20 3020
0000090 0a3b 200a 20206920 313d 0a3b 20202020
00000a0 3d6a 2b69 3b2b 200a 202070206972 746e
00000b0 28666922 203a 6425 202c 3a6a 2520 5c64
00000c0 226e 202c 2c69 6a20 3b29 0a0a 20202020
00000d0 65727574 6e72 3020 0a3b 007d          
00000db

2. 以八进制形式显示文件内容

hexdump -b test.c

使用

-b

选项可以以八进制格式输出:

jay@jaylinuxlenovo:~/test$ hexdump -b test.c
0000000 043 151156143154165144145 040 074 163164144151157 056
0000010 150 076 012 043 151156143154165144145 040 074 163164162
0000020 151156147 056 150 076 012 043 151156143154165144145 040
0000030 074 163164144151156164 056 150 076 012 012 165151156164
0000040 070 137164 040 164145163164137141162162141171133135
0000050 040 075 040 173 060 170 064 060 054 040 060 170 064 060 054 040
0000060 060 054 040 060 175 073 012 151156164 040 155141151156 050
0000070 051 040 173 012 040 040 040 040 151156164 040 151 040 075 040
0000080 060 073 012 040 040 040 040 151156164 040 152 040 075 040 060
0000090 073 012 012 040 040 040 040 151 075 061 073 012 040 040 040 040
00000a0 152 075 151 053 053 073 012 040 040 040 040 160162151156164
00000b0 146 050 042 151 072 040 045 144 054 040 152 072 040 045 144134
00000c0 156 042 054 040 151 054 040 152 051 073 012 012 040 040 040 040
00000d0 162145164165162156 040 060 073 012 175                    
00000db

3. 以字符形式显示文件内容

hexdump -c test.c

使用

-c

选项可以以 ASCII 字符形式显示文件内容:

jay@jaylinuxlenovo:~/test$ hexdump -c test.c
0000000   #   i   n   c   l   u   d   e       <   s   t   d   i   o   .
0000010   h   >\n   #   i   n   c   l   u   d   e       <   s   t   r
0000020   i   n   g   .   h   >\n   #   i   n   c   l   u   d   e    
0000030   <   s   t   d   i   n   t   .   h   >\n  \n   u   i   n   t
0000040   8   _   t       t   e   s   t   _   a   r   r   a   y   []
0000050       ={0   x   40   ,       0   x   40   ,    
0000060   0   ,       0};\n   i   n   t       m   a   i   n   (
0000070   ){\n                   i   n   t       i       =    
0000080   0;\n                   i   n   t       j       =0
0000090   ;\n  \n                   i   =1;\n                
00000a0   j   =   i   +   +   ;\n                   p   r   i   n   t
00000b0   f   ("   i   :       %   d   ,       j   :       %   d   \
00000c0   n   "   ,       i   ,       j   );\n  \n                
00000d0   r   e   t   u   r   n       0;\n   }                    
00000db

4. 以十六进制与 ASCII 混合模式显示文件内容

hexdump -C test.c

使用

-C

选项可以以 十六进制与 ASCII 混合模式显示文件内容:

jay@jaylinuxlenovo:~/test$ hexdump -C test.c
00000000  2369 6e 63 6c 75646520 3c 73746469 6f 2e  |#include <stdio.|
00000010  68 3e 0a 2369 6e 63 6c  75646520 3c 737472|h>.#include <str|
00000020  69 6e 67 2e 68 3e 0a 2369 6e 63 6c 75646520|ing.h>.#include |
00000030  3c 73746469 6e 74 2e  68 3e 0a 0a 7569 6e 74|<stdint.h>..uint|
00000040  38 5f 742074657374  5f 6172726179 5b 5d  |8_t test_array[]|
00000050  20 3d 20 7b 30783430  2c 2030783430 2c 20|={0x40, 0x40, |
00000060  30 2c 2030 7d 3b 0a 69  6e 7420 6d 6169 6e 28|0, 0};.int main(|
00000070  2920 7b 0a 2020202069 6e 74206920 3d 20|){.    int i =|
00000080  30 3b 0a 2020202069  6e 7420 6a 20 3d 2030|0;.    int j =0|
00000090  3b 0a 0a 2020202069  3d 31 3b 0a 20202020|;..i=1;.|
000000a0  6a 3d 69 2b 2b 3b 0a 20202020707269 6e 74|j=i++;.    print|
000000b0  66282269 3a 202564  2c 20 6a 3a 202564 5c  |f("i: %d, j: %d\|
000000c0  6e 22 2c 20 69 2c 20 6a  29 3b 0a 0a 20 20 20 20  |n", i, j);..|
000000d0  7265747572 6e 2030  3b 0a 7d                 |return0;.}|
000000db

5. 只显示指定字节数的文件内容

hexdump -n16 test.c

使用

-n

选项指定显示

test.c

的前 16 个字节内容:

jay@jaylinuxlenovo:~/test$ hexdump -n16 test.c
0000000 6923 636e 756c 6564 3c20 74736964 2e6f
0000010

6. 从指定字节偏移量开始显示文件内容

hexdump -s16 test.c

使用

-s

指定从文件的第 16 个字节开始显示内容:

jay@jaylinuxlenovo:~/test$ hexdump -s16 test.c
0000010 3e68 230a 6e69 6c63 64752065 733c 7274
0000020 6e69 2e67 3e68 230a 6e69 6c63 64752065
0000030 733c 6474 6e69 2e74 3e68 0a0a 6975 746e
0000040 5f38 207465747473 615f 72727961 5d5b
0000050 3d20 7b20 78303034 202c 78303034 202c
0000060 2c30 3020 3b7d 690a 746e 6d20 6961 286e
0000070 2029 0a7b 20202020 6e69 20742069 203d
0000080 3b30 200a 20206920 746e 6a20 3d20 3020
0000090 0a3b 200a 20206920 313d 0a3b 20202020
00000a0 3d6a 2b69 3b2b 200a 202070206972 746e
00000b0 28666922 203a 6425 202c 3a6a 2520 5c64
00000c0 226e 202c 2c69 6a20 3b29 0a0a 20202020
00000d0 65727574 6e72 3020 0a3b 007d          
00000db

注意事项

  • -v 选项中的重复行指的是输出时显示的行,而不是文件本身内容里的一行数据。比如输出按照 16 个字节一行,那么如果文件中出现与上 16 个字节完全相同的 16 个数据时,hexdump 就会输出一个 * ,直到遇到不相同的数据。
  • 对于每一个指定的输入文件,hexdump 都会按顺序复制输入数据到标准输出,并且根据 -e-f 选项指定的格式转换数据。
  • 如果没有指定任何格式字符串,则默认会执行与 -x 选项相同的操作。
  • 如果指定了字节计数,则不能同时指定多个转换字符或字符串,除非除了一个之外所有转换字符或字符串是 _a_A
标签: linux 运维 服务器

本文转载自: https://blog.csdn.net/Cris_Jay/article/details/141788591
版权归原作者 WKJay_ 所有, 如有侵权,请联系我们删除。

“Linux 常用命令 - hexdump 【以指定格式显示文件内容】”的评论:

还没有评论