2013. 4. 4. 00:46ㆍ프로그래밍/C언어 TIP
흠...
헥사 뷰~ 를 만들어서 어디에 사용할 것인지 아직은 자세히 알 수 없지만,
수업이니까! 일단 만들어 보도록 한다.
◎ Hexa_view만들기 1. 기본소스코드 만들기
먼저 source insight에 main.c, Hexa_view.c, Hexa_view.h 이렇게 파일을 세 개 만든다.
main.c 소스를 코딩해 봅니다. 아래와 같은 결과가 나올 수 있도록..
결과에 대한 소스 설명은 소스 코드 옆에!
아래는 결과에 대한 소스코드 입니다.
#include <stdio.h> int main() //지정한 파일의 헥사뷰를 보는 프로그램 { char array[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P' ,'Q','R','S','T','U','V','W','X','Y','Z'}; int iCnt; unsigned char ucCnt; unsigned char *ucP=(unsigned char *)array; //배열 array와 ucp가 자료형이 맞지 않으므로 캐스팅 해줘야 한다. printf("----------------------------------" "---------------------------------------\n"); printf(" Address Hexa" " ASCII\n"); printf(" "); for(iCnt = 0; iCnt <16; ++iCnt) { printf("%02X ",iCnt); } putchar('\n'); printf("----------------------------------" "---------------------------------------\n"); for(iCnt=0;iCnt<16;++iCnt) //줄을 담당하는 for문 { printf("%08X ",ucP); // 출력할 파일의 첫 부분 주소 for(ucCnt=0; ucCnt<16; ++ucCnt) // 출력할 값을 처음부터 차례대로 16진수로 16개씩 출력한다 { printf("%02X",*(ucP+ucCnt)); putchar(' '); } for(ucCnt=0; ucCnt<16; ++ucCnt) // 출력할 값을 아스키 코드로 출력 { if(0==*(ucP+ucCnt)) // 아스키 코드값이 0이면 '.'을 출력 { putchar('.'); } else if(32>*(ucP+ucCnt)) //아스키 코드 0~31번까지가 시스템 코드 이므로 그 부분은 '.'으로 출력 { putchar('.'); } else if(127<*(ucP+ucCnt)) //아스키 코드 127번을 초과하면 확장아스키코드이므로 127을 초과하면 '.'출력 { putchar('.'); } else { printf("%c",*(ucP+ucCnt)); // 아스키코드 32~127까지는 그대로 출력 } } putchar('\n'); ucP=ucP+16; } return 0; }
◎ Hexa_view만들기 2. 헥사뷰 기본 틀 만들기/ 헤더파일 링크하기
main.c는 아래처럼 HexaView함수를 호출하게 만든다.
HexaView.h에는 HexaView함수를 올려 놓는다.
처음에 만들어 놓은 Hexaview.c 파일에 main.c의 main함수 내용 전체를 복사하여 헤더파일의 Hexaview 함수 소스코드를
만들어 본다.
Hexaview()함수는 배열주소와 배열의 변수 갯수를 불러온다.
#include "HexaView.h" void Hexaview(unsigned char * ucP, unsigned int isize)//지정한 파일의 헥사뷰를 보는 프로그램 { char array[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P' ,'Q','R','S','T','U','V','W','X','Y','Z'}; //int iCnt; 대신 int iLoop; unsigned char ucCnt; //unsigned char *ucP=(unsigned char *)array; //배열 array와 ucp가 자료형이 맞지 않으므로 캐스팅 해줘야 한다. //배열을 받아오는 함수이므로 배열의 선언 부분은 주석처리한다. printf("----------------------------------" "---------------------------------------\n"); printf(" Address Hexa" " ASCII\n"); printf(" "); for(iCnt = 0; iCnt <16; ++iCnt) { printf("%02X ",iCnt); } putchar('\n'); printf("----------------------------------" "---------------------------------------\n"); if(0==isize%16) { isize = isize/16; //변수 갯수가 한 줄에 16개씩 출력되므로 16으로 나누어 떨어지면 나눈 몫만큼만 출력되게 } else { isize = (isize/16)+1; //16으로 나눠떨어지지 않으면 17번째 변수부터 다음줄에 출력되므로 1을 더해준다. } for(iLoop=0;iLoop
*(ucP+ucCnt)) //아스키 코드 0~31번까지가 시스템 코드 이므로 그 부분은 '.'으로 출력 { putchar('.'); } else if(127<*(ucP+ucCnt)) //아스키 코드 127번을 초과하면 확장아스키코드이므로 127을 초과하면 '.'출력 { putchar('.'); } else { printf("%c",*(ucP+ucCnt)); // 아스키코드 32~127까지는 그대로 출력 } } putchar('\n'); ucP=ucP+16; } return 0; }
'프로그래밍 > C언어 TIP' 카테고리의 다른 글
20130415/구조체의 사이즈 (0) | 2013.04.15 |
---|---|
20130404/ 다차원 배열。 (0) | 2013.04.04 |
201303/함수의 분리와 링크. 리눅스에서 make 사용 (0) | 2013.04.03 |
201303/ 포인터 주소 값의 연산. 함수의 원형. 함수의 정의 (0) | 2013.04.03 |
201303/포인터의 이해 (0) | 2013.04.03 |