我想/dev/input/mice
用 hexdump 阅读。格式描述于在 StackOverflow 上。我需要的是读取一个字节(标志),以十六进制格式打印它,然后读取两个字节(x 和 y 移动偏移量)并以带符号的十进制格式打印每个字节。
我用来自 util-linux 2.28 的十六进制转储在 Arch Linux 上。
我能做到的最好的就是
hexdump /dev/input/mice -e '/1 "%03x" 2/1 " %03d" /0 "\n"'
格式字符串:
/1 "%03x"
读取一个字节并将其打印为十六进制数2/1 " %03d"
读取一个字节并将其打印为有符号十进制整数,重复两次/0 "\n"
读取零字节并打印行尾
问题是对于值 0xFF,说明%d
符打印 255 而不是 -1。格式取自C,它适当地扩展了宽度,那么这里如何强制这种适当的宽度扩展呢?
答案1
这似乎是该实现中的一个错误hexdump
。
负责的函数是
print(struct hexdump_pr *pr, unsigned char *bp)
在hexdump-display.c
。它将正确的字节数复制到合适的变量中,以便在将值传递给 时可以进行符号扩展printf()
。但对于单个字节,它不会打扰 - 它只是取消引用指针,该指针指向一个未签名字符。
案例 F_INT: { 短斯瓦尔; /* int16_t */ 整数 ival; /* int32_t */ 长长Lval; /* int64_t, int64_t */ 开关(pr->bcnt){ 情况1: printf(pr->fmt, (无符号长长) *bp); 休息; 案例2: memmove(&sval, bp, sizeof(sval)); printf(pr->fmt, (无符号长长) sval); 休息;
要修复此问题,请修补该函数以使用相同的“复制到局部变量”方法:
--- text-utils/hexdump-display.c.orig 2015-10-05 15:18:43.458759033 +0100 +++ 文本实用程序/hexdump-display.c 2016-08-19 14:58:35.507705329 +0100 @@ -146,13 +146,15 @@ } 案例 F_INT: { + 字符 cval; /* int8_t */ 短斯瓦尔; /* int16_t */ 整数 ival; /* int32_t */ 长长Lval; /* int64_t, int64_t */ 开关(pr->bcnt){ 情况1: - printf(pr->fmt, (无符号长长) *bp); + memmove(&cval, bp, sizeof(cval)); + printf(pr->fmt, (无符号长长) cval); 休息; 案例2: memmove(&sval, bp, sizeof(sval));