가끔 소켓이나 파일에서 읽은 데이터가 무슨 내용인지 알아야 할 경우가 있습니다. 파일일 경우 유틸리티들이 많습니다.
울트라 에디터 또는 HxD 같은 툴로 볼수 있습니다. 그러나 프로그램중 소켓이나 데이터를 보아야 할 경우가 있습니다.
이때 코드를 HEX 또는 ASCII 로 보여주면 좋겠죠. 소위 C HexDump 소스코드입니다.
C HexDump 가 무엇인가요?
HexDump 는 C 프로그래밍에서 사용되는 도구로, 이진 데이터를 16진수와 ASCII 문자로 변환하여 사람이 읽을 수 있는 형태로 출력합니다. 이는 기계가 사용하는 이진 형식을 사람이 이해할 수 있는 형태로 변환하여 데이터의 구조를 시각화하는 데 도움이 됩니다.
툴들을 많습니다. 울트라에디트 , HxD 같은 프로그램입니다.
위 이미지 예제는 HxD 툴을 이용한 File View 예제입니다.
C 프로그램에서 데이터를 위의 예제처럼 로깅하길 원하는 경우가 많습니다. 그때 사용할 수 있는 코드를 아래에서 공개합니다.
소스코드
#include <ctype.h>
#include <stdio.h>
void hex_dump(const char* src, int src_size)
{
int i, j;
int linecnt = 1, count = 0;
int over_check = 0;
static unsigned char databuff[20];
src_size = src_size;
for (i = 0; i < src_size; i++)
{
if (!(count % 16))
{
printf( "[%06d]: ", linecnt);
linecnt += 16;
}
databuff[count++] = src[i];
if (count == 9)
printf( "- ");
printf( "%02x ", src[i] & 255);
if (count == 16)
{
printf( " *");
databuff[count] = src[i + 1];
if (over_check == 1)
databuff[0] = ' ';
over_check = 0;
for (j = 0; j < 16; j++)
{
if ((unsigned char)databuff[j] > 0x80)
{
printf( "%c%c", databuff[j], databuff[j + 1]);
j++;
if (j > 15)
over_check = 1;
}
else if (isprint((int)databuff[j]))
{
printf( "%c", databuff[j] & 255);
}
else
{
printf( ".");
}
}
printf( "*\n");
count = 0;
}
}
for (i = count, j = 0; i < 16; i++, j++)
printf( " ");
if (j >= 8)
printf( " *");
else
printf( " *");
if (over_check == 1)
databuff[0] = ' ';
for (i = 0; i < count; i++)
{
if ((unsigned char)databuff[i] > 0x80)
{
printf( "%c%c", databuff[i], databuff[i + 1]);
i++;
}
else if (isprint(databuff[i]))
{
printf( "%c", databuff[i] & 255);
}
else
{
printf( ".");
}
}
printf( "*\n\n");
return;
}
사용방법
사용방법은 아주 간단합니다. 아래 소스코드입니다.
int main()
{
char buff[256];
for(int i=0; i<256;i++)
{
buff[i] = i;
}
hex_dump(buff, 256);
}
위의 소스코드처럼 0~255 까지의 숫자를 반복하며 char 변수에 넣고 그 데이터를 화면에 뿌려주겠습니다. 결과는 다음과 같습니다.
마무리
어떤가요 데이터를 직관적으로 보기 좋지요? 이는 소켓등 패킷 분석이 필요할 때 간단히 쓰기 좋은 소스 코드 입니다. 물론 Log4Cpp 등 덩치큰 오픈 소스가 있으면 좋겠지만 간단한 작업일 경우 배보다 배꼽이 클수 있습니다. 위 소스 코드로 간단한 로그를 남겨 보세요.