Text-Formatting

使用 hexdump 列印一個字節的有符號數

  • August 19, 2016

我想/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. /1 "%03x"讀取一個字節並將其列印為十六進制數
  2. 2/1 " %03d"讀取一個字節並將其列印為有符號十進制整數,重複兩次
  3. /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));

引用自:https://unix.stackexchange.com/questions/304446