programing

C로 16진수 문자 인쇄

randomtip 2022. 8. 31. 22:03
반응형

C로 16진수 문자 인쇄

한 줄의 글자를 읽고 그 글자에 해당하는 16진수를 출력하려고 합니다.

예를 들어 다음과 같은 문자열이 있는 경우"0xc0 0xc0 abc123"(처음 2글자는c016진수로 표시되며 나머지 문자는abc123ASCII를 사용해서

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또는X16진수 이하 또는 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'에되어 있을 입니다.charvariable, 부호 있는 타입으로, 값이 음수(가장 유효한 비트 세트)입니다.다음 할 때 그, 쇄, 음, 음 등으로 됩니다.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

반응형