hexdumpを使用して1バイトの符号付き数値を印刷する

hexdumpを使用して1バイトの符号付き数値を印刷する

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. /1 "%03x"バイトを読み取り、16進数で印刷します。
  2. 2/1 " %03d"バイトを読み取り、それを符号付き10進整数として印刷して2回繰り返します。
  3. /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));

関連情報