hexdumpを使って読みたいです/dev/input/mice
。フォーマットについては後述する。スタックオーバーフローで。必要なのは、1バイト(フラグ)を読み取り、それを16進形式で印刷してから2バイト(xおよびyシフトオフセット)を読み取り、各バイトを符号付き10進形式で印刷することです。
私は使うutil-linux 2.28の16進ダンプArch Linuxで。
私ができる最善は
hexdump /dev/input/mice -e '/1 "%03x" 2/1 " %03d" /0 "\n"'
フォーマット文字列:
/1 "%03x"
バイトを読み取り、16進数で印刷します。2/1 " %03d"
バイトを読み取り、それを符号付き10進整数として印刷して2回繰り返します。/0 "\n"
0バイトの読み取りと行末の印刷
問題は、0xFF値の場合、指定子が%d
-1の代わりに255を印刷することです。フォーマットは、幅を適切に拡張するCから取得されます。それでは、ここで適切な幅拡張をどのように強制できますか?
答え1
これは実装上のバグのようですhexdump
。
担当機能は
print(struct hexdump_pr *pr, unsigned char *bp)
存在するhexdump-display.c
。値がに渡されると符号拡張できるように、正しい数のバイトを適切な変数にコピーしますprintf()
。ただし、シングルバイトの場合は問題になりません。ただポインタを逆参照するだけです。署名されていない性格。
ケースF_INT: { 短いsvar; /* 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 +++ textutils/hexdump-display.c 2016-08-19 14:58:35.507705329 +0100 @@-146,13 +146,15 @@ } ケースF_INT: { +文字cval; /* int8_t */ 短いsvar; /* 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));