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

在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年了……),所以似乎只能做到这样了。

猜你喜欢

转载自blog.csdn.net/imred/article/details/80877028
今日推荐