C로 16진수 문자 인쇄
한 줄의 글자를 읽고 그 글자에 해당하는 16진수를 출력하려고 합니다.
예를 들어 다음과 같은 문자열이 있는 경우"0xc0 0xc0 abc123"
(처음 2글자는c0
16진수로 표시되며 나머지 문자는abc123
ASCII를 사용해서
c0 c0 61 62 63 31 32 33
하지만,printf
사용.%x
준다
ffffffc0 ffffffc0 61 62 63 31 32 33
필요한 출력을 얻으려면 어떻게 해야 합니까?"ffffff"
왜 c0(및 80)만이 c0(및 80)이ffffff
다른 캐릭터는 안 되나요?
지금 보고 있는 것은ffffff
왜냐면char
가 시스템에 서명되어 있습니다.C에서는 다음과 같은 다양한 함수를 사용합니다.printf
보다 작은 모든 정수를 승격합니다.int
로.int
.부터char
는 정수(이 경우 8비트 부호 있는 정수)입니다.이 경우 문자가 로 승격됩니다.int
신호등을 통해
부터c0
그리고.80
선두의 1비트(8비트 정수로서 음수)를 가지며, 샘플의 다른 비트에는 없는 반면, 이러한 비트는 부호 변환됩니다.
char int
c0 -> ffffffc0
80 -> ffffff80
61 -> 00000061
해결책은 다음과 같습니다.
char ch = 0xC0;
printf("%x", ch & 0xff);
그러면 상위 비트가 마스크되고 원하는 하위 8비트만 유지됩니다.
실제로 int로의 타입 변환이 있습니다.또한 %hx 지정자를 사용하여 유형을 char로 강제 지정할 수도 있습니다.
printf("%hhX", a);
대부분의 경우 두 번째 문자를 0으로 채우는 최소 길이도 설정해야 합니다.
printf("%02hhX", a);
ISO/IEC 9899:201x:
7 길이 수식어와 그 의미는 다음과 같습니다.hh 다음 d, i, o, u, x 또는 X 변환 지정자가 부호 있는 문자 또는 부호 없는 문자 인수에 적용되도록 지정합니다(인수는 정수 프로모션에 따라 승격되지만 그 값은 부호 있는 문자 또는 부호 없는 문자로 변환된 후 인쇄해야 함).
사용할 수 있습니다.hh
인수가 부호 없는 문자임을 알 수 있습니다.사용하다0
패딩이 제로인 상태에서2
폭을 2로 설정합니다. x
또는X
16진수 이하 또는 16진수 이하일 경우
uint8_t a = 0x0a;
printf("%02hhX", a); // Prints "0A"
printf("0x%02hhx", a); // Prints "0x0a"
편집: 2501이 '올바른' 형식 지정자가 아니라고 주장하는 것에 대해 독자들이 우려하는 경우 링크를 다시 읽어보시길 권합니다.구체적으로는:
%c은(는) int 인수를 예상하지만 변수 함수를 호출할 때 정수 프로모션이 수행되므로 문자를 전달하는 것이 안전합니다.
헤더에는 고정 너비 문자 유형(int8_t 등)의 올바른 변환 사양이 정의되어 있습니다.
<cinttypes>
(C++)<inttypes.h>
(C) (PRIdMAX, PRIuMAX 등은 %jd, %ju 등과 동의어입니다).
서명된 int와 서명되지 않은 int에 대한 그의 요점은 이 경우 값이 항상 양의 값이어야 하고 서명된 int에 쉽게 맞아야 하기 때문에 문제가 되지 않습니다.서명된 16진수 형식 지정자는 없습니다.
편집 2: ("잘못 인정 시" 에디션:
311 페이지(PDF 329)의 실제 C11 표준을 읽으면 다음과 같은 것을 알 수 있습니다.
hh를 합니다.
d
,i
,o
,u
,x
, 「」X
는 변환 지정자에 됩니다.signed char
★★★★★★★★★★★★★★★★★」unsigned char
는 정수은 ""로 됩니다."signed char
★★★★★★★★★★★★★★★★★」unsigned char
(인쇄 전)n
는, 「변환」의에 적용됩니다.signed char
★★★★★★ 。
부호 없는 문자를 만들 수 있습니다.
unsigned char c = 0xc5;
인쇄하면,C5
andffffffc5
.
보다 큰 만 127로 됩니다.ffffff
챠르
'을 할 요.char
「 」:
char c = 0xc5;
printf("%x", (unsigned char)c);
은 아마 '0xc0'에되어 있을 입니다.char
variable, 부호 있는 타입으로, 값이 음수(가장 유효한 비트 세트)입니다.다음 할 때 그, 쇄, 음, 음 등으로 됩니다.int
의 바이트는 0xff로 패딩됩니다.따라서 마이너스입니다.int
하면 를 갖게 .char
하려면 , ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★unsigned char
「 」:
printf("%x", (unsigned char)variable);
다음과 같은 방법을 사용해 보십시오.
int main()
{
printf("%x %x %x %x %x %x %x %x\n",
0xC0, 0xC0, 0x61, 0x62, 0x63, 0x31, 0x32, 0x33);
}
그 결과, 다음과 같이 됩니다.
$ ./foo
c0 c0 61 62 63 31 32 33
서명된 문자 배열에서 인쇄하고 있을 수 있습니다.부호 없는 문자 배열에서 인쇄하거나 0xff: 예를 들어 ar[i] & 0xFF로 값을 마스크합니다.c0 값은 하이(부호) 비트가 설정되어 있기 때문에 부호 확장됩니다.
언급URL : https://stackoverflow.com/questions/8060170/printing-hexadecimal-characters-in-c
'programing' 카테고리의 다른 글
vue.js 필터에서 vue 인스턴스를 반환합니다(Vue.js 2). (0) | 2022.08.31 |
---|---|
vuex getter 캐시를 사용하지 않도록 설정하려면 어떻게 해야 합니까? (0) | 2022.08.31 |
vue watch mapState가 작동하지 않음 (0) | 2022.08.31 |
vuejs의 클래스 기반 구성 요소에 계산된 세터를 작성하는 방법 (0) | 2022.08.31 |
페이지를 변경할 때 Nuxt JS 페이지 컨텐츠가 깜박입니다. (0) | 2022.08.31 |