게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
소스를 함수 이용해서 작성하면 에러가 납니다.
게시물ID : programmer_9824짧은주소 복사하기
작성자 : ㅜ_ㅠ
추천 : 0
조회수 : 479회
댓글수 : 11개
등록시간 : 2015/05/09 20:32:51
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;
}

전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호