C 프로그래밍 : 배열 데이터를 16진수 형식으로 출력하기(Hex dump)

반응형

본 글에서는 배열에 담긴 바이트열 데이터를 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');
}

댓글

Designed by JB FACTORY