C/C++ 관련 포스팅 목록
2020/07/03 - [Linux/C] - C/C++ printf 포멧 API 사용 예제(출력) - 1
2020/07/02 - [Linux/C] - C/C++ C에서 Split 구현 예제(문자열 자르기 strtok)
2020/07/01 - [Linux/C] - C/C++ API 문자열 특정 문자로 나누기(strtok)
2020/06/28 - [Linux/C] - C/C++ API strchr(특정 문자 위치 검색)
2020/06/27 - [Linux/C] - C/C++ API access(파일 존재 여부 확인)
2020/06/26 - [Linux/C] - C/C++ API sprintf(문자열 붙이기)
리눅스 우분투에서 C 개발 환경 구성하기 관련 이전 포스팅
오늘 포스팅에서 다룰 C언어로 문자열의 Hex값 출력 예제를 따라하기에 앞서 리눅스에서 C 개발 환경이 구성되지 않았다면 아래 링크를 확인하여 개발환경을 구성해주세요. Codelite를 설치하면 됩니다.
2023.07.28 - [C] - [C/C++] Openssl 정적 라이브러리 빌드 및 Codelite 설치, 개발 환경 구성(ubuntu, codelite)
API의 필요성
안녕하세요. 오늘은 C언어 환경에서 문자열의 값들을 16진수로 출력하는 방법에 대해 알아보겠습니다. 가끔 디버깅이나 중간 점검을 위해 변수의 값들을 확인해야할 필요가 있습니다.
이때 아주 긴 문자열의 값 속에 예기치못한 값이 저장되어 있을 경우 문제가 생길 수 있습니다. 예를들어 C언어에서는 문자열을 출력하기 위해서는 반드시 버퍼의 마지막엔 NULL 값이 저장되어 있어야 합니다. 이 규칙은 정말 엄격합니다.
만약 원래 문자열의 중간에 NULL의 값이 이상하게 들어가있다면 당연히 비정상적인 문자열이 출력될 것이고, 이러한 문제는 이후 프로그램의 진행에 더 큰 오류를 발생시킬 가능성이 있습니다.
따라서 정상적인 문자열인지 아닌지 확인할 필요가 있습니다. 각 문자 값 하나 하나의 바이트 값을 출력하여 확인할 수 있다면 정말 편리하겠죠? 따라서 오늘 포스팅에서는 버퍼의 값을 바이트 단위로 출력하는 방법을 알아보겠습니다.
함수 구조 설명
#include <stdio.h>
void print_hex(const char *buf, int size);
# 인자
const char *buf
- 헥스 값으로 출력할 문자열 등의 버퍼 포인터
int size
- 버퍼의 총 크기인 정수 값
# 반환
- 없음
예제 목표
이번 예제의 목표는 char 포인터나 배열의 변수은 1byte 단위로 접근이 가능하다는 것과 printf의 hex표현 방식 포멧의 정확한 사용법을 이해하여 문자 변환 함수의 원리를 파악하는 것입니다.
이전 포스팅에서 다뤘던 printf API 사용법을 다시 확인한다면 16진수(HEX) 표현 방식에 대해 더 자세히 이해할 수 있습니다.
https://salguworld.tistory.com/68?category=949221
코드 작성
$ cd /tmp
$ mkdir print_hex_example; cd print_hex_example
$ vim print_hex_test.c
#include <stdio.h>
void print_hex(const char *buf, int size) {
int index;
for (index = 0; index < size; index++) {
if (index % 16 == 0) printf("\n");
printf("0x%02X ", buf[index]);
}
}
void main() {
char *test_str = "my name is cos\nhappy life is to observe myself";
print_hex((const char *)test_str, strlen(test_str));
}
위의 예제 코드는 특정 문자열의 각각 바이트 값을 "0x41" 과 같이 0x 표시를 붙인 헥스 값을 출력합니다. 여기서 조금 특별할 수도 있는 부분이 있습니다.
if (index % 16 == 0) printf("\n");
C에서 printf API는 "\n" 개행을 해주지 않으면 엔터를 하지 않고 계속 한줄에 출력합니다. 이렇게 출력되면 무슨 값인지 알아보기도 힘들어집니다.
우리가 이렇게 헥스 값으로 출력하는 이유도 편히 보기 위함인데, 저런식으로 한줄에 나오면 전혀 이유가 없겠죠.
따라서 버퍼의 크기까지 1byte 씩 값을 출력하면서 16으로 나누었을 때 나머지 값이 0일 때 엔터를 출력합니다. 인덱스의 값이 16으로 나누었을 때 0이라는 것은 곧, 16개의 문자가 출력됐다는 것을 의미합니다.
이제 이 예제를 빌드하여 실행해보겠습니다.
실행
$ cd /tmp/print_hex_example
$ gcc -c print_hex_test.c -o print_hex_test.out
$ gcc -o print_hex_test print_hex_test.out
$ ./print_hex_test
위와 같이 문자열의 바이트 값들이 Hex 문자열로 출력되고 있는 것을 확인하였습니다. 이 유틸리티성 함수는 반드시 버퍼의 크기를 알고 있는 상황에서 사용해야합니다.
다음 포스팅에서는 문자열의 길이를 알 수있는 strlen API에 대하여 포스팅 하도록 하겠습니다.
결과
위와 같이 문자열의 바이트 값들이 헥스 문자열로 출력되고 있는 것을 확인하였습니다. 이 유틸리티성 함수는 반드시 버퍼의 크기를 알고 있는 상황에서 사용해야합니다.
다음 포스팅에서는 문자열의 길이를 알 수있는 strlen API에 대하여 포스팅 하도록 하겠습니다.