mwultong Blog ... 프로그래밍 / 계산기

컴퓨터 엑셀 워드 포토샵 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Monday, April 16, 2007

C언어] 헥사 뷰어 소스, 헥사 덤프 만들기; Hex View, File Dump Source Code


파일의 내용을 16진수 헥사(Hex)로 출력하는 프로그램 소스입니다. 이진파일이든 텍스트 파일이든 모두 볼 수 있습니다.

헥사 뷰어 소스는 1993년도쯤에 터보C로 만든 적이 있는데, 지금 그 소스를 보니 너무 번잡해서, 오늘 처음부터 다시 깔끔하게 만들었습니다.

비주얼C 2005에서 프로그래밍되었습니다.

복잡하거나 강력한 기능은 없고, 최대한 간결하게 만든 소스입니다.

헥사 뷰어 만들기 소스


소스 파일명: hv.cpp
버전: 0.8
(※ 스크롤 박스 사용법: 박스 안을 마우스로 클릭한 후, 키보드의 좌우 화살표키를 누르면 양옆으로 움직일 수 있습니다. 박스에서 다시 나오려면, 박스 바깥의 아무곳이나 클릭하면 됩니다.)
#include <stdio.h>
#include <stdlib.h>


int hexView(const char* filename);


int main(int argc, char* argv[]) {
  if (argc == 1) {
    fputs("사용법: hexView 파일명\n", stderr);
    exit(1);
  }

  hexView(argv[1]);

  return 0;
}




int hexView(const char* filename) {  // 헥사 뷰어 함수의 본체
  FILE *in;
  size_t offset = 0; // 번지
  char buf16[16];    // 헥사 값이 16바이트, 즉, 한줄씩 저장될 버퍼
  size_t buf16Len;   // 한줄에 들어있는 헥사 값의 개수, 즉, 길이

  // if ((in  = fopen(filename, "rb")) == NULL) return 1; // 비주얼C 2003에서의 파일 열기

  // 비주얼C 2005에서의 파일 열기
  if (fopen_s(&in, filename, "rb") != 0) {
    fputs("파일 오픈 에러\n", stderr);
    return 1;
  }

  // 파일을 16바이트씩, 끝까지 읽으며 루프 돌리기
  while ( (buf16Len = fread(buf16, sizeof(char), sizeof(buf16), in)) != NULL ) {
    printf("%08X:  ", offset); // Offset (번지) 출력

    // 헥사 부분의 헥사 값 16개 출력 (8개씩 2부분으로)
    for (int i = 0; i < (int) buf16Len; i++) {
      if (i == 8) printf(" "); // 8개씩 분리
      printf("%02X ", (unsigned char) buf16[i]); // 헥사 값 출력
    }

    // 한 줄이 16 바이트가 되지 않을 때, 헥사 부분과 문자 부분 사이에 공백들 삽입
    for (int i = 0; i <= (16 - (int) buf16Len) * 3; i++)
      printf(" ");
    if (buf16Len < 9) printf(" "); // 한줄이 9바이트보다 적을 때는 한칸 더 삽입

    // 문자 부분 출력
    for (int i = 0; i < (int) buf16Len; i++) {
      if (buf16[i] >= 0x20 && buf16[i] <= 0x7E) // 특수 문자 아니면 출력
        printf("%c", buf16[i]);
      else printf("."); // 특수문자, 그래픽문자 등은 마침표로 출력
    }

    offset += 16; // 번지 값을 16 증가
    printf("\n"); // 줄바꿈
  }


  if (offset == 0) printf("%08X:  ", offset); // 0바이트 파일일 경우 처리
  fclose(in); // 파일 닫기

  return 0;
}



컴파일 및 실행 결과 화면:
클릭한후옆으로스크롤가능
D:\Z>cl hv.cpp
hv.cpp

D:\Z>hv.exe
사용법: hexView 파일명

D:\Z>hv.exe test.txt
00000000:  23 69 6E 63 6C 75 64 65  20 3C 73 74 64 69 6F 2E  #include <stdio.
00000010:  68 3E 0D 0A 23 69 6E 63  6C 75 64 65 20 3C 73 74  h>..#include <st
00000020:  64 6C 69 62 2E 68 3E 0D  0A 0D 0A 0D 0A 69 6E 74  dlib.h>......int
00000030:  20 68 65 78 56 69 65 77  28 63 6F 6E 73 74 20 63   hexView(const c
00000040:  68 61 72 2A 20 66 69 6C  65 6E 61 6D 65 29 3B 0D  har* filename);.
00000050:  0A 0D 0A 0D 0A 69 6E 74  20 6D 61 69 6E 28 69 6E  .....int main(in
00000060:  74 20 61 72 67 63 2C 20  63 68 61 72 2A 20 61 72  t argc, char* ar
00000070:  67 76 5B 5D 29 20 7B 0D  0A 20 20 69 66 20 28 61  gv[]) {..  if (a
00000080:  72 67 63 20 3D 3D 20 31  29 20 7B 0D 0A 20 20 20  rgc == 1) {..
00000090:  20 66 70 75 74 73 28 22  BB E7 BF EB B9 FD 3A 20   fputs("......:
000000A0:  68 65 78 56 69 65 77 20  3C C6 C4 C0 CF B8 ED 3E  hexView <......>
000000B0:  5C 6E 22 2C 20 73 74 64  65 72 72 29 3B 0D 0A 20  \n", stderr);..
000000C0:  20 20 20 65 78 69 74 28  31 29 3B 0D 0A 20 20 7D     exit(1);..  }
000000D0:  0D 0A 0D 0A 20 20 68 65  78 56 69 65 77 28 61 72  ....  hexView(ar
000000E0:  67 76 5B 31 5D 29 3B 0D  0A 0D 0A 20 20 72 65 74  gv[1]);....  ret
000000F0:  75 72 6E 20 30 3B 0D 0A  7D 0D 0A 0D 0A 0D 0A 0D  urn 0;..}.......
00000100:  0A 0D 0A 69 6E 74 20 68  65 78 56 69 65 77 28 63  ...int hexView(c
00000110:  6F 6E 73 74 20 63 68 61  72 2A 20 66 69 6C 65 6E  onst char* filen
00000120:  61 6D 65 29 20 7B 20 20  2F 2F 20 C7 ED BB E7 20  ame) {  // ....
00000130:  BA E4 BE EE 20 C7 D4 BC  F6 C0 C7 20 BA BB C3 BC  .... ...... ....
00000140:  0D 0A 20 20 46 49 4C 45  20 2A 69 6E 3B 0D 0A 20  ..  FILE *in;..
00000150:  20 69 6E 74 20 70 6F 73  20 3D 20 30 3B 0D 0A 20   int pos = 0;..
00000160:  20 63 68 61 72 20 62 75  66 5B 31 36 5D 3B 0D 0A   char buf[16];..
00000170:  20 20 73 69 7A 65 5F 74  20 6C 65 6E 4C 69 6E 65    size_t lenLine
00000180:  3B 0D 0A 0D 0A 20 20 2F  2F 20 69 66 20 28 28 69  ;....  // if ((i
00000190:  6E 20 20 3D 20 66 6F 70  65 6E 28 66 69 6C 65 6E  n  = fopen(filen
000001A0:  61 6D 65 2C 20 22 72 62  22 29 29 20 3D 3D 20 4E  ame, "rb")) == N
000001B0:  55 4C 4C 29 20 72 65 74  75 72 6E 20 31 3B 20 2F  ULL) return 1; /
000001C0:  2F 20 BA F1 C1 D6 BE F3  43 20 32 30 30 33 BF A1  / ......C 2003..
000001D0:  BC AD C0 C7 20 C6 C4 C0  CF 20 BF AD B1 E2 0D 0A  .... .... ......
000001E0:  0D 0A                                             ..

D:\Z>hv.exe test.txt > out.txt

D:\Z>



cl hv.cpp && hv.exe test.txt > out.txt
이렇게 하면 out.txt 라는 파일로 출력 결과가 저장됩니다.

위에서 test.txt 란, 뷰어로 볼 아무 이름의 파일을 의미합니다.


참고: ▶▶ [QnA] 헥사 에디터란? 좋은 헥사 에디터(Hex Editor)는? : WinHex




tag: cpp
C언어 | C/C++ (Visual C++)

2 Comments:
At February 24, 2016 at 1:54 PM, Blogger Unknown said...

비주얼 스튜디오 2013으로 실행이 안 되네요.. 컴파일러가 달라서 그런가?

에러는 없는데 창이 사라져서.. 비주얼스튜디오로 실행법 부탁드립니다

 
At February 24, 2016 at 2:33 PM, Blogger mwultong said...

소스 상단의 #include <stdlib.h> 다음 줄에
#include <conio.h>
이렇게 적은 후

main() 함수에서

hexView(argv[1]);

return 0;
사이에

_getch();
를 넣어 주시면 됩니다.

_getch() 또는 getch() 함수는, 콘솔창(명령 프롬프트)이 즉시 종료되지 않도록, 일시 중지시킬 때 쓸 수 있습니다.
원래 용도는 "키보드로부터 글자 1개를 받아서 int 로 반환하는 함수"입니다.

 

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Previous Posts
Monthly Archives
Top