Text-Formatting
使用 hexdump 列印一個字節的有符號數
我想
/dev/input/mice
用 hexdump 閱讀。格式在此處的 StackOverflow中進行了描述。我需要的是讀取一個字節(標誌),以十六進制格式列印,然後讀取兩個字節(x 和 y 移動偏移量)並以有符號十進制格式列印每個字節。我在 Arch Linux 上使用util-linux 2.28 的 hexdump 。
我能做到的最好的就是
hexdump /dev/input/mice -e '/1 "%03x" 2/1 " %03d" /0 "\n"'
格式字元串:
/1 "%03x"
讀取一個字節並將其列印為十六進制數2/1 " %03d"
讀取一個字節並將其列印為有符號十進制整數,重複兩次/0 "\n"
讀取零字節並列印行尾問題是對於值 0xFF,
%d
說明符列印 255 而不是 -1。格式取自C,它適當地擴展了寬度,那麼如何在這裡強制這種適當的寬度擴展呢?
這似乎是
hexdump
.負責的職能是
print(struct hexdump_pr *pr, unsigned char *bp)
在
hexdump-display.c
. 它將正確數量的字節複製到一個合適的變數中,以便在將值傳遞給printf()
. 但是對於單個字節,它不會打擾 - 它只是取消引用指向無符號字元的指針。案例 F_INT: { 短 sval;/ * int16_t * / 國際;/* int32_t */ 長長的Lval;/* int64_t, int64_t */ 開關(pr->bcnt){ 情況1: printf(pr->fmt, (unsigned long long) *bp); 休息; 案例2: memmove (& sval, bp, sizeof (sval)); printf(pr->fmt, (unsigned long long) sval); 休息;
要修復它,請修補函式以使用相同的“複製到局部變數”方法:
--- text-utils/hexdump-display.c.orig 2015-10-05 15:18:43.458759033 +0100 +++ text-utils/hexdump-display.c 2016-08-19 14:58:35.507705329 +0100 @@ -146,13 +146,15 @@ } 案例 F_INT: { + 字元 cval;/* int8_t */ 短 sval;/ * int16_t * / 國際;/* int32_t */ 長長的Lval;/* int64_t, int64_t */ 開關(pr->bcnt){ 情況1: - printf(pr->fmt, (unsigned long long) *bp); + memmove(&cval, bp, sizeof(cval)); + printf(pr->fmt, (unsigned long long) cval); 休息; 案例2: memmove (& sval, bp, sizeof (sval));