伤心客 发表于 2024-9-6 05:45:09

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 被解析为一个十进制数,假如以 0x 或 0X 开头,则被解析为十六进制数;假如以 0 开头,则被解析为八进制数。以偏移量以 b,k,m 末端依次表示乘以 512,1024,1048576。
[*] -v:体现所有的输入数据。假如不使用 -v ,则 hexdump 会简化输出,如当碰到两组连续输出的行内容完全相同时,第二组及后续的重复行会被替换为一个仅含有 * 的行。
[*] -x:每行体现 8 个数据,每个数据由两个字节构成,以十六进制情势表示,每个数据占四列宽度,不敷四列用零填充,每个数据间用空格分隔,每行的开头为十六进制体现的数据偏移。
格式 (Formats)

格式字符串可以包含恣意数量的格式单元,使用空格分隔。一个单元包含最多三个部分:迭代计数,字节计数以及格式。
迭代计数是一个可选的正整数,默认为 1。每个格式都会应用相应的次数。
字节计数是一个可选的正整数,假如指定了字节计数,则其将定义每次迭代格式时要解析的字节数。
假如指定了迭代计数或字节计数,则必须在迭代计数或(和)字节计数前加一个 / 来进行区分。而且 / 前后的空白字符会被忽略。
格式部分是必须的,且必须用双引号括起来。格式会被解析为 fprintf 风格的字符串,不过存在以下特殊环境:


[*]不能使用星号 * 作为字段宽度或精度的占位符。
[*]对于每个 s 转换字符,必须指定字节计数或字段精度。
[*]不支持以下转换字符:%,h,l,n,p,q。
[*]支持 C 标准中描述的单字符转义序列:   描述转义序列NUL\0警报字符\a退格\b换页\f换行\n回车\r程度制表符\t垂直制表符\v
hexdump 还支持以下额外的转换字符:
_a:体现下一个要体现的字节在输入文件中的偏移量,累计计算所有输入文件的偏移量。追加的字符 d,o,x 分别指定为十进制,八进制或十六进制体现。
_A:与 _a 转换字符串相同,但只在所有输入数据处理处罚完后实验一次。
_c:以默认字符集输出字符。非打印字符体现为三个字符的八进制表示,可以用标准转义符号表示的字符体现为两个字符的字符串。
_p:以默认字符集输出字符,非打印字符体现为单独的 . 。
_u: 输出 US ASCII 字符,控制字符按照以下小写名称体现,大于 0xff 的字符以十六进制字符串体现:
000 NUL001 SOH002 STX003 ETX004 EOT005 ENQ
006 ACK007 BEL008 BS   009 HT   00A LF   00B VT
00C FF   00D CR   00E SO   00F SI   010 DLE011 DC1
012 DC2013 DC3014 DC4015 NAK016 SYN017 ETB
018 CAN019 EM   01A SUB01B ESC01C 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 7473 6964 2e6f0000010 3e68 230a 6e69 6c63 6475 2065 733c 72740000020 6e69 2e67 3e68 230a 6e69 6c63 6475 20650000030 733c 6474 6e69 2e74 3e68 0a0a 6975 746e0000040 5f38 2074 6574 7473 615f 7272 7961 5d5b0000050 3d20 7b20 7830 3034 202c 7830 3034 202c0000060 2c30 3020 3b7d 690a 746e 6d20 6961 286e0000070 2029 0a7b 2020 2020 6e69 2074 2069 203d0000080 3b30 200a 2020 6920 746e 6a20 3d20 30200000090 0a3b 200a 2020 6920 313d 0a3b 2020 202000000a0 3d6a 2b69 3b2b 200a 2020 7020 6972 746e00000b0 2866 6922 203a 6425 202c 3a6a 2520 5c6400000c0 226e 202c 2c69 6a20 3b29 0a0a 2020 202000000d0 6572 7574 6e72 3020 0a3b 007d          00000db 2. 以八进制情势体现文件内容

hexdump -b test.c
使用 -b 选项可以以八进制格式输出:
jay@jaylinuxlenovo:~/test$ hexdump -b test.c
0000000 043 151 156 143 154 165 144 145 040 074 163 164 144 151 157 0560000010 150 076 012 043 151 156 143 154 165 144 145 040 074 163 164 1620000020 151 156 147 056 150 076 012 043 151 156 143 154 165 144 145 0400000030 074 163 164 144 151 156 164 056 150 076 012 012 165 151 156 1640000040 070 137 164 040 164 145 163 164 137 141 162 162 141 171 133 1350000050 040 075 040 173 060 170 064 060 054 040 060 170 064 060 054 0400000060 060 054 040 060 175 073 012 151 156 164 040 155 141 151 156 0500000070 051 040 173 012 040 040 040 040 151 156 164 040 151 040 075 0400000080 060 073 012 040 040 040 040 151 156 164 040 152 040 075 040 0600000090 073 012 012 040 040 040 040 151 075 061 073 012 040 040 040 04000000a0 152 075 151 053 053 073 012 040 040 040 040 160 162 151 156 16400000b0 146 050 042 151 072 040 045 144 054 040 152 072 040 045 144 13400000c0 156 042 054 040 151 054 040 152 051 073 012 012 040 040 040 04000000d0 162 145 164 165 162 156 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   r0000020   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   t0000040   8   _   t       t   e   s   t   _   a   r   r   a   y   [   ]0000050       =       {   0   x   4   0   ,       0   x   4   0   ,    0000060   0   ,       0   }   ;\n   i   n   t       m   a   i   n   (0000070   )       {\n                   i   n   t       i       =    0000080   0   ;\n                   i   n   t       j       =       00000090   ;\n\n                   i   =   1   ;\n                00000a0   j   =   i   +   +   ;\n                   p   r   i   n   t00000b0   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
0000000023 69 6e 63 6c 75 64 6520 3c 73 74 64 69 6f 2e|#include <stdio.|0000001068 3e 0a 23 69 6e 63 6c75 64 65 20 3c 73 74 72|h>.#include <str|0000002069 6e 67 2e 68 3e 0a 2369 6e 63 6c 75 64 65 20|ing.h>.#include |000000303c 73 74 64 69 6e 74 2e68 3e 0a 0a 75 69 6e 74|<stdint.h>..uint|0000004038 5f 74 20 74 65 73 745f 61 72 72 61 79 5b 5d|8_t test_array[]|0000005020 3d 20 7b 30 78 34 302c 20 30 78 34 30 2c 20| = {0x40, 0x40, |0000006030 2c 20 30 7d 3b 0a 696e 74 20 6d 61 69 6e 28|0, 0};.int main(|0000007029 20 7b 0a 20 20 20 2069 6e 74 20 69 20 3d 20|) {.    int i = |0000008030 3b 0a 20 20 20 20 696e 74 20 6a 20 3d 20 30|0;.    int j = 0|000000903b 0a 0a 20 20 20 20 693d 31 3b 0a 20 20 20 20|;..    i=1;.    |000000a06a 3d 69 2b 2b 3b 0a 2020 20 20 70 72 69 6e 74|j=i++;.    print|000000b066 28 22 69 3a 20 25 642c 20 6a 3a 20 25 64 5c|f("i: %d, j: %d\|000000c06e 22 2c 20 69 2c 20 6a29 3b 0a 0a 20 20 20 20|n", i, j);..    |000000d072 65 74 75 72 6e 20 303b 0a 7d               |return 0;.}|000000db 5. 只体现指定字节数的文件内容

hexdump -n 16 test.c
使用 -n 选项指定体现 test.c 的前 16 个字节内容:
jay@jaylinuxlenovo:~/test$ hexdump -n 16 test.c
0000000 6923 636e 756c 6564 3c20 7473 6964 2e6f0000010 6. 从指定字节偏移量开始体现文件内容

hexdump -s 16 test.c
使用 -s 指定从文件的第 16 个字节开始体现内容:
jay@jaylinuxlenovo:~/test$ hexdump -s 16 test.c
0000010 3e68 230a 6e69 6c63 6475 2065 733c 72740000020 6e69 2e67 3e68 230a 6e69 6c63 6475 20650000030 733c 6474 6e69 2e74 3e68 0a0a 6975 746e0000040 5f38 2074 6574 7473 615f 7272 7961 5d5b0000050 3d20 7b20 7830 3034 202c 7830 3034 202c0000060 2c30 3020 3b7d 690a 746e 6d20 6961 286e0000070 2029 0a7b 2020 2020 6e69 2074 2069 203d0000080 3b30 200a 2020 6920 746e 6a20 3d20 30200000090 0a3b 200a 2020 6920 313d 0a3b 2020 202000000a0 3d6a 2b69 3b2b 200a 2020 7020 6972 746e00000b0 2866 6922 203a 6425 202c 3a6a 2520 5c6400000c0 226e 202c 2c69 6a20 3b29 0a0a 2020 202000000d0 6572 7574 6e72 3020 0a3b 007d          00000db 留意事项



[*] -v 选项中的重复行指的是输出时体现的行,而不是文件本身内容里的一行数据。好比输出按照 16 个字节一行,那么假如文件中出现与上 16 个字节完全相同的 16 个数据时,hexdump 就会输出一个 * ,直到碰到不相同的数据。
[*] 对于每一个指定的输入文件,hexdump 都会按次序复制输入数据到标准输出,而且根据 -e 和 -f 选项指定的格式转换数据。
[*] 假如没有指定任何格式字符串,则默认会实验与 -x 选项相同的操作。
[*] 假如指定了字节计数,则不能同时指定多个转换字符或字符串,除非除了一个之外所有转换字符或字符串是 _a 或 _A。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Linux 常用下令 - hexdump 【以指定格式体现文件内容】