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

news/2024/9/17 1:19:43/ 标签: linux, 运维, 服务器

简介

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]:显示下一个要显示的字节在输入文件中的偏移量,累计计算所有输入文件的偏移量。追加的字符 dox 分别指定为十进制,八进制或十六进制显示。

_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 7473 6964 2e6f
0000010 3e68 230a 6e69 6c63 6475 2065 733c 7274
0000020 6e69 2e67 3e68 230a 6e69 6c63 6475 2065
0000030 733c 6474 6e69 2e74 3e68 0a0a 6975 746e
0000040 5f38 2074 6574 7473 615f 7272 7961 5d5b
0000050 3d20 7b20 7830 3034 202c 7830 3034 202c
0000060 2c30 3020 3b7d 690a 746e 6d20 6961 286e
0000070 2029 0a7b 2020 2020 6e69 2074 2069 203d
0000080 3b30 200a 2020 6920 746e 6a20 3d20 3020
0000090 0a3b 200a 2020 6920 313d 0a3b 2020 2020
00000a0 3d6a 2b69 3b2b 200a 2020 7020 6972 746e
00000b0 2866 6922 203a 6425 202c 3a6a 2520 5c64
00000c0 226e 202c 2c69 6a20 3b29 0a0a 2020 2020
00000d0 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 056
0000010 150 076 012 043 151 156 143 154 165 144 145 040 074 163 164 162
0000020 151 156 147 056 150 076 012 043 151 156 143 154 165 144 145 040
0000030 074 163 164 144 151 156 164 056 150 076 012 012 165 151 156 164
0000040 070 137 164 040 164 145 163 164 137 141 162 162 141 171 133 135
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 151 156 164 040 155 141 151 156 050
0000070 051 040 173 012 040 040 040 040 151 156 164 040 151 040 075 040
0000080 060 073 012 040 040 040 040 151 156 164 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 160 162 151 156 164
00000b0 146 050 042 151 072 040 045 144 054 040 152 072 040 045 144 134
00000c0 156 042 054 040 151 054 040 152 051 073 012 012 040 040 040 040
00000d0 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   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   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       =       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  23 69 6e 63 6c 75 64 65  20 3c 73 74 64 69 6f 2e  |#include <stdio.|
00000010  68 3e 0a 23 69 6e 63 6c  75 64 65 20 3c 73 74 72  |h>.#include <str|
00000020  69 6e 67 2e 68 3e 0a 23  69 6e 63 6c 75 64 65 20  |ing.h>.#include |
00000030  3c 73 74 64 69 6e 74 2e  68 3e 0a 0a 75 69 6e 74  |<stdint.h>..uint|
00000040  38 5f 74 20 74 65 73 74  5f 61 72 72 61 79 5b 5d  |8_t test_array[]|
00000050  20 3d 20 7b 30 78 34 30  2c 20 30 78 34 30 2c 20  | = {0x40, 0x40, |
00000060  30 2c 20 30 7d 3b 0a 69  6e 74 20 6d 61 69 6e 28  |0, 0};.int main(|
00000070  29 20 7b 0a 20 20 20 20  69 6e 74 20 69 20 3d 20  |) {.    int i = |
00000080  30 3b 0a 20 20 20 20 69  6e 74 20 6a 20 3d 20 30  |0;.    int j = 0|
00000090  3b 0a 0a 20 20 20 20 69  3d 31 3b 0a 20 20 20 20  |;..    i=1;.    |
000000a0  6a 3d 69 2b 2b 3b 0a 20  20 20 20 70 72 69 6e 74  |j=i++;.    print|
000000b0  66 28 22 69 3a 20 25 64  2c 20 6a 3a 20 25 64 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  72 65 74 75 72 6e 20 30  3b 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 2e6f
0000010

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

hexdump -s 16 test.c

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

jay@jaylinuxlenovo:~/test$ hexdump -s 16 test.c
0000010 3e68 230a 6e69 6c63 6475 2065 733c 7274
0000020 6e69 2e67 3e68 230a 6e69 6c63 6475 2065
0000030 733c 6474 6e69 2e74 3e68 0a0a 6975 746e
0000040 5f38 2074 6574 7473 615f 7272 7961 5d5b
0000050 3d20 7b20 7830 3034 202c 7830 3034 202c
0000060 2c30 3020 3b7d 690a 746e 6d20 6961 286e
0000070 2029 0a7b 2020 2020 6e69 2074 2069 203d
0000080 3b30 200a 2020 6920 746e 6a20 3d20 3020
0000090 0a3b 200a 2020 6920 313d 0a3b 2020 2020
00000a0 3d6a 2b69 3b2b 200a 2020 7020 6972 746e
00000b0 2866 6922 203a 6425 202c 3a6a 2520 5c64
00000c0 226e 202c 2c69 6a20 3b29 0a0a 2020 2020
00000d0 6572 7574 6e72 3020 0a3b 007d          
00000db

注意事项

  • -v 选项中的重复行指的是输出时显示的行,而不是文件本身内容里的一行数据。比如输出按照 16 个字节一行,那么如果文件中出现与上 16 个字节完全相同的 16 个数据时,hexdump 就会输出一个 * ,直到遇到不相同的数据。

  • 对于每一个指定的输入文件,hexdump 都会按顺序复制输入数据到标准输出,并且根据 -e-f 选项指定的格式转换数据。

  • 如果没有指定任何格式字符串,则默认会执行与 -x 选项相同的操作。

  • 如果指定了字节计数,则不能同时指定多个转换字符或字符串,除非除了一个之外所有转换字符或字符串是 _a_A


http://www.ppmy.cn/news/1521825.html

相关文章

Leetcode每日刷题之155.最小栈

1.题目解析 本题是实现一个栈并且要实现其中的插入、删除、返回栈顶元素、返回最小元素的函数&#xff0c;这里主要的难点就是返回最小元素的函数&#xff0c;如果我们直接遍历&#xff0c;那么时间复杂度就是O(N)&#xff0c;但是题目要求我们需要在常数时间也就是O(1)的时间复…

Docker必备命令集合,让你轻松驾驭容器化

Docker作为现代化应用程序的部署和管理平台&#xff0c;已经成为开发者和运维工程师的得力工具。但对于新手而言&#xff0c;面对众多的命令和参数&#xff0c;有时会感到困惑。本文将为你总结一组常用的Docker命令&#xff0c;助你快速上手并高效使用这一强大工具。 1. 基础命…

Qt数字化信息通讯调制解调

对于数字化信息通讯调制解调&#xff0c;Qt本身并不直接提供调制解调的功能&#xff0c;但是可以通过Qt的网络编程接口&#xff0c;结合相关的算法和硬件设备来实现。例如&#xff0c;可以通过Qt的信号处理库来实现数字信号的调制和解调算法&#xff0c;或者通过串口通信与外部…

word中怎么快速选中光标之前或之后的全部内容?

在Word中&#xff0c;快速选中光标之后的全部内容的快捷键&#xff1a;Ctrl Shift End&#xff1b; 在Word中&#xff0c;快速选中光标之前的全部内容的快捷键&#xff1a;Ctrl Shift Home。 在Word中&#xff0c;选取的快捷键如下。 一、选定整个文本&#xff1a; 1&#…

微信小程序认证和备案

小程序备案的流程一般包括以下步骤‌&#xff1a; 准备备案所需材料‌&#xff1a;通常需要提供‌营业执照、法人的‌身份证、两个‌手机号和一个邮箱等资料。 ‌1 ‌登录‌微信公众平台‌&#xff1a;作为第一次开发微信小程序的服务商&#xff0c;需要通过微信公众平台申请…

掌握Git分支管理策略:让团队协作更高效

在现代软件开发过程中&#xff0c;版本控制系统&#xff08;VCS&#xff09;是不可或缺的一部分。Git作为目前最流行的分布式版本控制系统之一&#xff0c;为开发者提供了强大的工具集来管理代码变更历史。然而&#xff0c;仅仅掌握Git的基本命令并不足以应对大型项目和团队协作…

中间代码例题

答案&#xff1a;D 知识点&#xff1a; 中间代码是一种简单且含义明确的记号系统&#xff0c;可以有若干形式&#xff0c;它们的共同特征是与机器无关。 最常见的中间代码有&#xff1a;后缀式&#xff0c;语法树&#xff0c;三地址码&#xff0c;四元式 这些往往是数据&am…

HarmonyOS开发实战( Beta5版)Stack组件实现滚动吸顶效果实现案例

介绍 本示例介绍运用Stack组件以构建多层次堆叠的视觉效果。通过绑定Scroll组件的onScroll滚动事件回调函数&#xff0c;精准捕获滚动动作的发生。当滚动时&#xff0c;实时地调节组件的透明度、高度等属性&#xff0c;从而成功实现了嵌套滚动效果、透明度动态变化以及平滑的组…

linux中普通用户免密切换root

在 Linux 中如果要实现不输入密码直接切换到 root 权限&#xff0c;可以通过配置 sudoers 文件来实现。但这种方式有一定安全风险&#xff0c;使用时需谨慎。 以下是具体步骤&#xff1a; 1.以当前有 sudo 权限的用户身份打开终端。 2.使用以下命令编辑 /etc/sudoers 文件&…

WordPress安装指南:主题、插件和最佳实践

WordPress是世界上最流行的内容管理系统&#xff08;CMS&#xff09;&#xff0c;因其易用性和灵活性而备受欢迎。本文将指导您完成WordPress的安装过程&#xff0c;介绍一些常用的主题和插件&#xff0c;并分享一些重要的注意事项。 1. WordPress安装 步骤1&#xff1a;准备…

数字时代,寻找新的生意增长点之前要做什么准备?

要做好最基础也最繁复的数据管理。 在竞争日益激烈的快消市场中&#xff0c;企业面临前所未有的挑战与压力。在这种高压环境下&#xff0c;数字化转型不再仅仅是选择&#xff0c;而是企业探索新的业务增长点、保持竞争优势的关键战略。然而&#xff0c;随着企业数字化进程的加…

MATLAB进行天线阵列方向图综合

摘要&#xff1a;本次推文将介绍如何利用MATLAB的Sensor Array Analyzer进行天线阵列的方向图综合。 1. 阵列方向图综合理论 对于均匀平面阵列而言&#xff0c;其阵因子公式可以写成 当阵列是三角网格布置或者圆环阵时&#xff0c;《ANTENNA THEORY ANALYSIS AND DESIGN》等相…

Postgresql表和索引占用空间回收释放(表空间膨胀)

Postgresql表和索引占用空间回收释放&#xff08;表空间膨胀&#xff09; -- 1.创建测试表t_user create table if not exists t_user(id serial primary key,user_name varchar(255),pass_word varchar(255),create_time date,dr char(1) );create index ind_time on t_user(c…

【学习笔记】SSL证书安全机制之证书验证

前言&#xff1a;每当Client从Server收到一张证书&#xff0c;有2件事Client需要去验证&#xff1a; 证书是否有效&#xff1f; 证书只是文件中的文本Client如何知道内容能够信任&#xff1f;Server是否是证书真正的拥有者&#xff1f; 证书可以公开获取Client如何知道Server是…

rsync搭建全网备份

rsync搭建全网备份 1. 总体概述1.1 目标1.2 简易指导图1.3 涉及工具或命令1.4 环境 2. 实施2.1 配置备份服务器2.2 备份文件准备2.3 整合命令2.4 扩展功能 1. 总体概述 1.1 目标 本次搭建目标&#xff1a; 每天定时把服务器数据备份到备份服务器备份完成后进行校验把过期数据…

代码随想录 -- 二叉树 -- 二叉树的最小深度

111. 二叉树的最小深度 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;递归调用 递归返回值&#xff1a;返回以当前节点为根节点的二叉树的最小深度 递归出口&#xff1a;当根节点为空时&#xff0c;返回 0 单层递归逻辑&#xff1a;特殊情况处理&#xff1a;当…

【区块链 + 人才服务】区块链教学管理平台 | FISCO BCOS应用案例

面对传统教育行业存在的教育过程难监督、教育信息不公开、教育效果难认定、教务管理缺抓手、数据造假和证 书局限性等诸多痛点问题。北京奕江科技有限公司基于 FISCO BCOS 底层开发区块链教学管理平台&#xff0c;搭建区块链 教学管理系统、区块链课程学习及实训环境&#xff0…

HTTP中常用的4种请求方式——前端如何发送?后端怎么接受?

一.Get请求&#xff1a; 1.什么是Get请求&#xff1f; 2.前后端如何使用Get交互&#xff1f; 2.1.Query参数格式的Get请求 2.2.Path参数格式的Get请求 二.Post请求&#xff1a; 1.什么是Post请求&#xff1f; 2.前后端如何使用Post交互&#xff1f; 三.Put请求&#xf…

C语言代码练习(第十五天)

今日练习&#xff1a; 37、输入连个正整数 n 和 m &#xff0c;求其最大公约数和最小公倍数 38、请编程序将“China”翻译成密码&#xff0c;密码规律是&#xff1a;用原来的字母后面第4个字符代替原来的字母 39、设半径 r 1.5&#xff0c;圆柱高 h 3&#xff0c;求圆周长、圆…

优化 spring boot 的启动速度

优化Spring Boot应用的启动速度可以采取以下几个策略&#xff1a; 最小化依赖&#xff1a;检查项目是否有不必要的依赖&#xff0c;特别是那些启动时不使用的库。使用spring-boot-starter-web而不是spring-boot-starter-tomcat可以减少一些默认依赖。 懒加载组件&#xff1a;使…