hexdump를 사용하여 1바이트 부호 있는 숫자 인쇄

hexdump를 사용하여 1바이트 부호 있는 숫자 인쇄

hexdump를 사용하여 읽고 싶습니다 /dev/input/mice. 형식은 다음에 설명되어 있습니다.스택오버플로우에서. 필요한 것은 1바이트(플래그)를 읽고 이를 16진수 형식으로 인쇄한 다음 2바이트(x 및 y 시프트 오프셋)를 읽고 각 바이트를 부호 있는 10진수 형식으로 인쇄하는 것입니다.

나는 사용한다util-linux 2.28의 16진수 덤프아치 리눅스에서.

내가 할 수 있는 최선은

 hexdump /dev/input/mice -e '/1 "%03x" 2/1 " %03d" /0 "\n"'

형식 문자열:

  1. /1 "%03x"바이트를 읽고 16진수로 인쇄합니다.
  2. 2/1 " %03d"바이트를 읽고 이를 부호 있는 십진 정수로 인쇄하고 두 번 반복합니다.
  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));

관련 정보