이 튜토리얼에서는 C++에서 문자열을 16진수 ASCII 값으로 변환하는 프로그램을 구현하는 방법에 대해 알아보겠습니다.
프로그래밍을 하다 보면 문자열 데이터를 16진수 형태로 표현해야 하는 경우가 종종 있습니다. 네트워크 통신에서 데이터를 전송하거나 디버깅 시 메모리 내용을 확인할 때 특히 유용합니다. 이번 글에서는 주어진 문자열의 각 문자를 해당하는 16진수 ASCII 값으로 변환하여 출력하는 코드를 살펴보겠습니다.
변환 원리
ASCII 문자는 각각 고유한 숫자 값을 가지며, 이 값을 16진수로 표현하면 두 자리 숫자가 됩니다. 예를 들어 소문자 't'의 ASCII 값은 10진수로 116이며, 이를 16진수로 변환하면 '74'가 됩니다. 따라서 문자열의 각 문자를 순회하면서 sprintf 함수와 %02X 서식 지정자를 사용하면 손쉽게 변환할 수 있습니다.
예제 코드
#include <stdio.h>
#include <string.h>
// 문자열을 16진수로 변환하는 함수
void convert_hexa(char* input, char* output){
int loop = 0;
int i = 0;
while(input[loop] != '\0'){
// 각 문자를 2자리 16진수로 변환하여 저장
sprintf((char*)(output+i), "%02X", input[loop]);
loop += 1;
i += 2;
}
// 문자열의 끝을 표시
output[i++] = '\0';
}
int main(){
char ascii_str[] = "tutorials point";
int len = strlen(ascii_str);
// 각 문자당 2개의 16진수 문자가 필요하므로 (len*2)+1 크기 할당
char hex_str[(len*2)+1];
// 함수 호출
convert_hexa(ascii_str, hex_str);
printf("ASCII: %s\n", ascii_str);
printf("Hexadecimal: %s\n", hex_str);
return 0;
}실행 결과
ASCII: tutorials point Hexadecimal: 7475746F7269616C7320706F696E74
코드 설명
convert_hexa 함수: 입력 문자열을 한 문자씩 순회하면서 sprintf를 사용해 각 문자를 2자리 16진수로 변환합니다. 여기서 %02X는 대문자 16진수로 출력하되, 한 자리 수인 경우 앞을 0으로 채워 항상 2자리를 유지하도록 합니다.
출력 버퍼 크기: 각 ASCII 문자는 2개의 16진수 문자로 변환되므로, 출력 배열은 원본 문자열 길이의 2배에 널 종료 문자 공간 1바이트를 더한 (len*2)+1 크기로 선언해야 합니다.
공백 문자 처리: "tutorials point" 중간의 공백은 ASCII 값 32로, 16진수 '20'으로 변환된 것을 실행 결과에서 확인할 수 있습니다.