Monday, April 16, 2007
C언어] 헥사 뷰어 소스, 헥사 덤프 만들기; Hex View, File Dump Source Code
파일의 내용을 16진수 헥사(Hex)로 출력하는 프로그램 소스입니다. 이진파일이든 텍스트 파일이든 모두 볼 수 있습니다.
헥사 뷰어 소스는 1993년도쯤에 터보C로 만든 적이 있는데, 지금 그 소스를 보니 너무 번잡해서, 오늘 처음부터 다시 깔끔하게 만들었습니다.
비주얼C 2005에서 프로그래밍되었습니다.
복잡하거나 강력한 기능은 없고, 최대한 간결하게 만든 소스입니다.
소스 파일명: hv.cpp
버전: 0.8
(※ 스크롤 박스 사용법: 박스 안을 마우스로 클릭한 후, 키보드의 좌우 화살표키를 누르면 양옆으로 움직일 수 있습니다. 박스에서 다시 나오려면, 박스 바깥의 아무곳이나 클릭하면 됩니다.)
컴파일 및 실행 결과 화면:
클릭한후옆으로스크롤가능
cl hv.cpp && hv.exe test.txt > out.txt
이렇게 하면 out.txt 라는 파일로 출력 결과가 저장됩니다.
위에서 test.txt 란, 뷰어로 볼 아무 이름의 파일을 의미합니다.
참고: ▶▶ [QnA] 헥사 에디터란? 좋은 헥사 에디터(Hex Editor)는? : WinHex
헥사 뷰어 소스는 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;
}
#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>
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++)
비주얼 스튜디오 2013으로 실행이 안 되네요.. 컴파일러가 달라서 그런가?
에러는 없는데 창이 사라져서.. 비주얼스튜디오로 실행법 부탁드립니다
소스 상단의 #include <stdlib.h> 다음 줄에
#include <conio.h>
이렇게 적은 후
main() 함수에서
hexView(argv[1]);
와
return 0;
사이에
_getch();
를 넣어 주시면 됩니다.
_getch() 또는 getch() 함수는, 콘솔창(명령 프롬프트)이 즉시 종료되지 않도록, 일시 중지시킬 때 쓸 수 있습니다.
원래 용도는 "키보드로부터 글자 1개를 받아서 int 로 반환하는 함수"입니다.
<< Home