http://mwultong.blogspot.com/2007/04/c-hex-view-file-dump-source-code.html 에서 나온 소스를 함수를 1개 더 추가해서 결과가 같도록 표현해보려고 했었는데요..(직접 입력 안받고 test화일을 읽는 점만 다릅니다.)
원래는 작성하다가 컴파일도 않되어서 확인해보니 코드가 길어지면서 잘못된 문장이 들어간것 같아서 이번에는 컴파일이 되도록 수정한 것 같은데요.
아래처럼 수정 되었는데 그런데...
결과가 16개씩 않나오고 이상하게 1/4로 줄어서 문자열 HEX열 모두 4개씩 나옵니다.
test.txt 파일에 ABCDEFGHIJKLMNOPQRSTUVWXYZ..abcdefghijklmnopqrstuvwxyz..1234567891011121314151617181920
를 넣고 실행하면 결과가 아래처럼 나옵니다.
원래는 hex값 문자열 모두 16개씩(16열) 나와야 하는데 아래처럼 4개씩 밖에 않나옵니다.ㅡ.ㅜ;
00000000: 41 42 43 44 ABCD
00000010: 45 46 47 48 EFGH
00000020: 49 4A 4B 4C I J KL
00000030: 4D 4E 4F 50 MNOP
00000040: 51 52 53 54 QRST
00000050: 55 56 57 58 UVWX
00000060: 59 5A 2E 2E YZ . .
00000070: 61 62 63 64 abcd
00000080: 65 66 67 68 efgh
00000090: 69 6A 6B 6C i j k l
000000A0: 6D 6E 6F 70 mnop
....................................
..................
진짜 미친놈처럼 별의 별별 생쇼를 몇시간에 걸쳐서 했지만 수정되지 않네요
.ㅜ.ㅜ;
왜 이 소스 컴파일해서 cmd창에서 실행하면 결과가 16열씩 안나오고 4열씩 나오는 이유가 뭔지 아시는분 답변 주시면 정말 고맙겠네요.ㅜ.ㅜ
부탁드립니다.ㅜ.ㅜ;ㅜ.ㅜ;ㅜ.ㅜ;ㅜ.ㅜ;
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int hexView(const char* filename);
void Show_hexpage(char* buf16,FILE *in, size_t buf16Len,size_t offset);
void Show_hexpage(char* buf16,FILE *in, size_t buf16Len,size_t offset){
// 파일을 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"); // 줄바꿈
}
}
int hexView(const char* filename)
{
FILE *in;
size_t offset = 0; // 번지
char buf16[16]; // 헥사 값이 16바이트, 즉, 한줄씩 저장될 버퍼
size_t buf16Len=0; // 한줄에 들어있는 헥사 값의 개수, 즉, 길이
if (fopen_s(&in, filename, "rb") != 0) {
fputs("파일 오픈 에러\n", stderr);
return 1;
}
Show_hexpage(buf16,in, buf16Len,offset);
if (offset == 0) printf("%08X: ", offset); // 0바이트 파일일 경우 처리
fclose(in); // 파일 닫기
return 0;
}
int main(int argc, char* argv[])
{
if (argc == 0)
{
fputs("사용법: hexView 파일명\n", stderr);
exit(1);
}
hexView("test.txt");
return 0;
}