프로그래밍/C 프로그래밍
C 프로그래밍 : 배열 데이터를 16진수 형식으로 출력하기(Hex dump)
오늘도 야근
2020. 2. 9. 21:49
본 글에서는 배열에 담긴 바이트열 데이터를 16진수 형식으로 출력(Hex dump)하는 함수를 소개한다.
본 함수는 다양한 형태의 바이트열 데이터(예: 네트워크 패킷 데이터)에 담긴 내부 정보를 로그로 출력하여 디버깅하는 용도로 많이 활용된다.
본 함수를 실행하면, 다음 그림처럼 리눅스에서 xxd 명령을 통해 출력되는 형태와 유사하게 출력된다. 좌측에는 오프셋 값, 중앙에는 Hex dump 값, 우측에는 ASCII 코드 값이 출력된다.
다음은 Hex dump 출력 함수 전문이다.
#include <stdint.h>
#include <stdio.h>
/**
* 버퍼에 담긴 데이터에 대한 Hex dump 를 출력한다. 우측에 아스키 값도 함께 출력한다.
*
* @param[in] data 출력할 데이터가 담긴 배열
* @param[in] len 출력할 데이터의 길이
*/
void PrintHexDump(const uint8_t *data, const size_t len)
{
int i, j;
char c;
if(len == 0) {
return;
}
#define COLUMN_NUM 16
for (i = 0; i < len + ((len % COLUMN_NUM) ? (COLUMN_NUM - len % COLUMN_NUM) : 0); i++)
{
// 오프셋 출력
if ((i % COLUMN_NUM) == 0) {
printf("0x%06X: ", i);
}
// Hex dump 출력
if (i < len) {
printf("%02X ", *(data + i));
} else {
printf(" ");
}
// ASCII dump 출력
if ((i % COLUMN_NUM) == (COLUMN_NUM - 1)) {
for (j = i - (COLUMN_NUM - 1); j <= i; j++) {
c = *(data + j);
if (j >= len) {
putchar(' ');
} else if ((c >= ' ') && (c <= '~')) {
putchar(c & 0xff);
} else {
putchar('.');
}
}
putchar('\n');
}
}
putchar('\n');
}