使用 hexdump 打印一字节有符号数

使用 hexdump 打印一字节有符号数

我想/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. /1 "%03x"读取一个字节并将其打印为十六进制数
  2. 2/1 " %03d"读取一个字节并将其打印为有符号十进制整数,重复两次
  3. /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));

相关内容