Linux下的hexdump用法一例:分析鼠标事件

本文介绍如何在Linux系统中使用简单的命令来观察键盘和鼠标的原始输入事件,通过cat命令结合hexdump工具的不同选项,逐步提高输出结果的可读性和解析度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在linux下有时我们需要观察键盘或鼠标等外设的原始输入事件,可以选择编写一个小程序,读相应的设备然后打印出来,但是这种方法稍显麻烦,可能没个10分钟搞不定。还可以使用另一种方式:直接使用机器上自带的一些程序观察输入事件。
如果只是要观察有无输入事件上来,那么只使用cat就够了,假如我们要观察鼠标设备(在我的机器上,鼠标设备是/dev/input/event6):

$ sudo cat /dev/input/event6
X�8[� X�8[�X�8[�X�8[�
X�8[�
X�8[�

直接输入命令,然后操作鼠标,就可以观察有无鼠标事件上来了,但鼠标事件具体是什么完全看不出来,cat认为这些事件数据都是ascii字符,打印出来大多数是乱码。
为了让结果好看一点,可以用hexdump装饰一下:

$ sudo cat /dev/input/event6 | hexdump
0000000 b40c 5b38 0000 0000 447f 000c 0000 0000
0000010 0004 0004 0001 0009 b40c 5b38 0000 0000
0000020 447f 000c 0000 0000 0001 0110 0001 0000
0000030 b40c 5b38 0000 0000 447f 000c 0000 0000
0000040 0000 0000 0000 0000 b40d 5b38 0000 0000
0000050 8a29 0003 0000 0000 0004 0004 0001 0009
0000060 b40d 5b38 0000 0000 8a29 0003 0000 0000
0000070 0001 0110 0000 0000 b40d 5b38 0000 0000
0000080 8a29 0003 0000 0000 0000 0000 0000 0000

比原来好看多了,如果你熟悉鼠标设备报告的input_event数据结构,那就可以直接分析上面报告的这些事件了。
还能不能让结果更好看呢?当然可以,观察input_event数据结构:

struct input_event {
#if (__BITS_PER_LONG != 32 || !defined(__USE_TIME_BITS64)) && !defined(__KERNEL)
    struct timeval time;
#define input_event_sec time.tv_sec
#define input_event_usec time.tv_usec
#else
    __kernel_ulong_t __sec;
    __kernel_ulong_t __usec;
#define input_event_sec  __sec
#define input_event_usec __usec
#endif
    __u16 type;
    __u16 code;
    __s32 value;
};

前面16个字节是时间戳,我一般不关心;接着2字节(16bits)是类型(鼠标移动?鼠标键动作?等);再接着2字节(16bits)是code(不知道怎么翻译好,是对类型进行了细化。x方向移动?y方向移动?左键动作?右键动作?等);最后4字节(32bits)是值(移动了多远?键按下?键弹起?等)。了解了事件的具体数据结构以后,就可以,使用hexdump的-e选项对这个特定的格式进行格式化了:

$ sudo cat /dev/input/event6 | hexdump -e ’ 16/1 “%02x” 2/2 ” %04x” 1/4 ” %d” “\n”’
4bc3385b000000009f37040000000000 0002 0000 1
4bc3385b000000009f37040000000000 0002 0001 1
4bc3385b000000009f37040000000000 0000 0000 0
4bc3385b00000000da6e040000000000 0002 0001 1
4bc3385b00000000da6e040000000000 0000 0000 0

可以把input_event按照字段分开输出,可以省掉在脑中解码这一步:)。不过时间字段的可读性比较差,hexdump似乎没办法处理8字节整数(这都8102年了……),所以似乎只能做到这样了。

<think>嗯,用户问的是Linux下的hexdump是什么操作。我之前已经回答过关于Valgrind的问题,现在用户转向另一个工具hexdump,可能是在学习Linux系统调试或数据处理相关的知识。首先,我需要确认用户的使用场景。用户可能是在处理二进制文件,或者需要查看文件的十六进制表示,比如调试、逆向工程,或者数据恢复。 接下来,用户的身份可能是一位开发者,或者是系统管理员,也可能是学生。他们可能对Linux工具不太熟悉,想了解hexdump的基本用法和功能。用户的需求不仅仅是知道hexdump是什么,可能更想知道它能解决什么问题,以及如何使用它。比如,用户可能有一个二进制文件,需要查看其内容,或者验证数据是否正确写入。 用户可能没有直接表达出来的深层需求是,如何有效地利用hexdump进行数据分析,或者与其他工具结合使用。比如,结合grep过滤特定数据,或者与其他十六进制工具如xxd进行比较。因此,在回答时,除了介绍基本功能,还需要给出一些实用例子和常见使用场景,帮助用户理解如何应用这个工具。 hexdump的主要功能是以十六进制、十进制、八进制或ASCII形式显示文件内容。默认情况下,它会显示每行的偏移量、十六进制字节和对应的ASCII字符。用户可能需要知道如何定制输出格式,比如指定每行显示的字节数,或者只显示十六进制部分而不显示ASCII。 另外,用户可能想知道hexdump与其他类似工具(如xxd、od)的区别,比如xxd通常和vim配合使用,而od可能更专注于八进制输出。这时候需要简要比较,帮助用户选择适合的工具。 在实际例子中,用户可能需要查看二进制文件的结构,比如检查文件头是否符合特定格式,或者查找文件中的特定字节序列。比如,查看PNG文件的头部是否有正确的签名,或者检查JPEG文件的起始标记。这时候给出具体命令和输出示例会很有帮助。 同时,用户可能遇到需要处理不同字节序的情况,比如大端序和小端序,hexdump如何显示这些数据。这时候需要解释格式字符串的使用,比如用“%x”显示十六进制,或者“%d”显示十进制,以及如何组合这些格式。 最后,提醒用户注意权限问题,比如需要读取权限才能hexdump某个文件,以及处理大文件时的分页显示,比如使用less配合。可能还需要提到hexdump的局限性,比如对于非常大的文件,可能需要结合其他工具进行分块处理。 总结下来,回答需要涵盖hexdump的功能、基本用法、常见选项、实用例子、与其他工具的比较,以及注意事项,确保用户能够全面理解并有效使用这个工具。</think>`hexdump` 是 Linux 下用于**以十六进制、ASCII 或其他格式查看文件二进制内容**的命令行工具。它常被用来分析二进制文件、调试数据或检查文件底层结构。 --- ### **核心功能** 1. **二进制转十六进制** 默认直接显示文件的十六进制字节和对应 ASCII 字符: ```bash hexdump file.bin ``` 输出示例: ``` 00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR| 00000010 00 00 02 80 00 00 01 e0 08 06 00 00 00 35 6e 3c |.............5n<| ``` - 左侧 `00000000` 是字节偏移量(十六进制) - 中间每行显示 16 字节(默认分两组,每组 8 字节) - 右侧 `|...|` 是对应的 ASCII 可打印字符(不可见字符显示为 `.`) 2. **自定义显示格式** 通过 `-C` 显示规范化格式(类似 `xxd`): ```bash hexdump -C file.bin ``` 输出示例: ``` 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 00000010 03 00 3e 00 01 00 00 00 10 5a 00 00 00 00 00 00 |..>......Z......| ``` 3. **指定进制转换** 支持十六进制(默认)、十进制(`-d`)、八进制(`-o`)等: ```bash hexdump -d file.bin # 十进制显示 ``` 4. **控制输出细节** - `-s 偏移量`:跳过开头指定字节(如 `-s 100` 跳过前 100 字节) - `-n 长度`:仅显示指定字节数(如 `-n 32` 显示前 32 字节) - `-v`:强制显示所有数据(默认会省略重复行) --- ### **高级用法** #### **1. 自定义格式字符串** 通过 `-e` 定义输出格式(类似 `printf`): ```bash hexdump -e '16/1 "%02x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值