C HexDump 출력 소스코드 및 활용 예제

가끔 소켓이나 파일에서 읽은 데이터가 무슨 내용인지 알아야 할 경우가 있습니다. 파일일 경우 유틸리티들이 많습니다.
울트라 에디터 또는 HxD 같은 툴로 볼수 있습니다. 그러나 프로그램중 소켓이나 데이터를 보아야 할 경우가 있습니다.
이때 코드를 HEX 또는 ASCII 로 보여주면 좋겠죠. 소위 C HexDump 소스코드입니다.

C HexDump 가 무엇인가요?

HexDump 는 C 프로그래밍에서 사용되는 도구로, 이진 데이터를 16진수와 ASCII 문자로 변환하여 사람이 읽을 수 있는 형태로 출력합니다. 이는 기계가 사용하는 이진 형식을 사람이 이해할 수 있는 형태로 변환하여 데이터의 구조를 시각화하는 데 도움이 됩니다.

툴들을 많습니다. 울트라에디트 , HxD 같은 프로그램입니다.

C HexDump 출력 소스코드 및 활용 예제

위 이미지 예제는 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 변수에 넣고 그 데이터를 화면에 뿌려주겠습니다. 결과는 다음과 같습니다.

C HexDump 출력 소스코드 및 활용 예제

마무리

어떤가요 데이터를 직관적으로 보기 좋지요? 이는 소켓등 패킷 분석이 필요할 때 간단히 쓰기 좋은 소스 코드 입니다. 물론 Log4Cpp 등 덩치큰 오픈 소스가 있으면 좋겠지만 간단한 작업일 경우 배보다 배꼽이 클수 있습니다. 위 소스 코드로 간단한 로그를 남겨 보세요.

Leave a Comment