Coding & Programming/C, C++

[C/C++] 코드 내 에서 Hex Editor 같이 바이너리 출력하기(Binary output like Hex Editor in code)

mainCodes 2021. 2. 28. 08:50

안녕하세요 JollyTree (•̀ᴗ•́)و 입니다. 

 

대부분의 워드, 멀티미디어, 압축 등의 프로그램들은 동영상, 압축, 그림 등 바이너리 파일을 대부분 사용하며 코딩을 하다보면 바이너리 파일을 읽고 써야 할때가 자주 발생합니다. 010Editor, Ultra Editor, Hex Editor, Hxd 등은 바이너리 파일을 아주 보기 쉽게 16진수 Hex 코드로 보여줍니다. 그리고 사용자 설정에 맞게 16바이트, 32바이트 등으로 정렬을 해서 편의를 제공하기도 합니다.

 

 

 

텍스트 데이터는 디버거나 코드상에서 printf, fprintf, puts 등의 함수로 출력하여 바로 확인이 가능하지만, 

내가 짠 프로그램이 제대로 바이너리 파일을 읽고 썼는지, 소켓(Socket)으로 송·수신은 제대로 되었는지 등을  코드 내에서 확인할 수 있다면 정말 편리합니다. 실제로 그런 일이 많이 발생하는 것 같구요. (•̀ᴗ•́)و

 

제대로 바이너리 데이터가 읽고 써지고, 송·수신 되었는지 보기 위해서는 디버거를 이용할 수도 있지만, 본인이 짠 프로그램 내에서 바이너리 데이터를 읽은 후, 그리고 쓰기 직전, 송신 직전, 송신 직후, 수신 직후 각각 특정 시점에서 확인해야 할 때 아래 예제코드를 사용하면 정말 유용합니다.

 

예제(Example):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#define _CRT_SECURE_NO_WARNINGS 1
 
#include <stdio.h>
#include <ctype.h>
#include <memory.h>
#include <stdlib.h>
 
void binary2hex_print(char* filename, char* buf, int len)
{
    int i=0, j=0;
    unsigned char* p1 = (unsigned char*)buf;
    unsigned char *p2 = (unsigned char*)buf;
 
    printf("+++ %s (%s:%d)\n""mainCodes", filename, len);
    printf("----------------------------------------------------------------\n");
    printf("++++++++++++++++ BINARY HEX +++++++++++++++++++ ++ ASCII +++++++\n");
    printf("----------------------------------------------------------------\n");
    for (i = 0; i < len; i++
    {
        printf("%02x ", (unsigned int)*(p1 + i));
        if (((i + 1) % 16 == 0&& (i > 0)) 
        {
            for (j = 0; j < 16; j++
            {
                if (isprint(*(p2 + j)) && (iscntrl(*(p2 + j)) == 0))
                    printf("%c"*(p2 + j));
                else
                    printf(".");
            }
            printf("\n");
            p2 = p1 + i + 1;
        }
    }
 
    if ((((i + 1) % 16<= 15&& ((i + 1) % 16 != 1)) 
    {
        for (j = (i + 1) % 16 - 1; j < 16; j++)
            printf("   ");
 
        for (j = 0; j < (i + 1) % 16 - 1; j++
        {
            if (isprint(*(p2 + j)) && (iscntrl(*(p2 + j)) == 0))
                printf("%c"*(p2 + j));
            else
                printf(".");
        }
        printf("\n");
    }
    printf("----------------------------------------------- ----------------\n");
}
 
 
#define FILE_NAME "pthreadVC2_part.lib"
 
int main()
{
    FILE* fp = NULL;
    int size = 0;
    char *read_buf = NULL;
 
    fp = fopen(FILE_NAME, "rb"); //바이너리 읽기 모드
    if (fp == NULL)
    {
        printf("open error\n");
        return 1;
    }
 
    fseek(fp, 0, SEEK_END);
    size = ftell(fp);
    fseek(fp, 0, SEEK_SET);
 
    read_buf = (char*)calloc(size+1sizeof(char));
    fread(read_buf, sizeof(char), size, fp);
    fclose(fp);
 
    //바이너리 파일 화면 출력
    binary2hex_print((char*)FILE_NAME, read_buf, size);
 
    return 0;
}
 
 
cs

 

실행결과(Output):

 

 

이상,  JollyTree 였습니다. 꾸벅. (•̀ᴗ•́)و