ASCII to Hex
간단히 말해서 입력이 String인데, 이것을 16진수 값으로 변환하는 코드를 구현해보도록 하겠습니다.
간단히 "CAFECAFE0102"라는 이런 문자열을 입력을 받았는데 16진수로 변환하고 싶은 것입니다. 즉, 0xCA, 0xFE, 0xCA, 0xFE, 0x01, 0x02의 숫자 배열로 입력을 변환하는 것이죠.
가장 간단하게 구현하기 위해서 매우 정상적인 입력값만 들어온다고 가정하겠습니다. 그러니까 16진수의 범위에 있지 않은 글자('G'를 넘어가는 알파벳)는 들어오지 않는다고 가정하겠습니다.
설명은 아래의 주석으로 대체하도록 하겠습니다.
#include <stdio.h>
#include <stdint.h>
#include <string.h>
//입력의 str은 모두 대문자인 16진수 변환가능한 문자열이라고 가정
//size는 str의 크기
//hex는 변환된 16진수 배열
unsigned int ascii_to_hex(const char* str, size_t size, uint8_t* hex)
{
unsigned int i, h, high, low;
for (h = 0, i = 0; i < size; i += 2, ++h) {
//9보다 큰 경우 : 알파벳 문자 'A' 이상인 문자로, 'A'를 빼고 10을 더함.
//9이하인 경우 : 숫자 입력으로 '0'을 빼면 실제 값이 구해짐.
high = (str[i] > '9') ? str[i] - 'A' + 10 : str[i] - '0';
low = (str[i + 1] > '9') ? str[i + 1] - 'A' + 10 : str[i + 1] - '0';
//high 4비트, low 4비트이므로, 1바이트를 만들어주기 위해 high를 왼쪽으로 4비트 shift
//이후 OR(|)연산으로 합
hex[h] = (high << 4) | low;
}
return h;
}
int main() {
char str[128] = "CAFEcafe0102";
uint8_t hex[128] = { 0, };
size_t size = strlen(str);
int i;
//소문자 cafe를 대문자로 만들기 위해 strupr함수 사용
strupr(str);
//hex에 실제 16진수의 값이 들어감
ascii_to_hex(str, size, hex);
//size는 반으로 줄어듦, ex) hex[0]=0xCA;
for (i = 0; i < (size/2); i++)
printf("0x%02X\n", hex[i]);
}
1바이트의 unsigned int 자료형인 uint8_t를 사용하기 위해서는 stdint.h를 include해야합니다.
결과
사실 ascii에 대한 개념과 char 자료형이 정수처럼 계산할 수 있다는 사실, 그리고 비트 연산(SHIFT, OR) 연산만 이해하고 알고 있다면 그렇게 어려운 구현은 아니라고 생각이 됩니다.
'언어 > C언어' 카테고리의 다른 글
[C/C++] switch ~ case 문의 활용방법 - 흔한 실수까지 (0) | 2022.03.29 |
---|---|
[C언어] 조건문 If ~ else if ~ else 총정리 - 쉽게 하는 실수들까지 (0) | 2022.03.23 |
[C언어] clock() 함수로 프로그램 수행 시간 구하는 코드 - 시간 측정 코드 (0) | 2021.05.30 |
[C언어] 문자열을 숫자로 변환하는 함수들 (atoi, atof, atol) 소개와 간단하게 atoi 구현 (0) | 2021.05.30 |
[C언어] 출력 형식(format) 총정리 (Feat. sprintf, fprintf) - 일정한 간격으로 문자열 출력 예제 까지 (0) | 2021.04.15 |