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