Develop
2013.04.23 13:08
[c] 오류체크(CRC 체크 ) 소스
조회 수 8236 댓글 2
CRC 체크 소스 코드
/* CRC-32b version 1.03 by Craig Bruce, 27-Jan-94 ** ** Based on "File Verification Using CRC" by Mark R. Nelson in Dr. Dobb's ** Journal, May 1992, pp. 64-67. This program DOES generate the same CRC ** values as ZMODEM and PKZIP ** ** 수정 : 한원희, 차용주 */ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <time.h> #include <math.h> #define OCTET 256 #define ECTET_MAX 255 #define FRAME_SIZE 1024 #define FCS_SIZE 4 #define TOTAL_SIZE 1028 #define ERROR_STEP 200 #define ERROR_MAX 4100 #define TEST_TIMES 1000 void frame_gen(char *frame) ; void error_gen(char *frame, int err_cnt) ; void crcgen(void) ; void err_pos_gen(int err_cnt) ; int get_fcs(char *frame, int frame_size) ; unsigned long crcTable[256]; int error_pos[TOTAL_SIZE*8] ; /******************************************************************/ int main( int argc, char *argv[] ) { int err_cnt, i, count ; unsigned long crc; time_t seed ; char in_frame[TOTAL_SIZE], out_frame[TOTAL_SIZE] ; time(&seed) ; srand(seed) ; crcgen(); /* 초기화... */ printf(" *** CRC 에러 검출 시뮬레이션 ***\n\n") ; printf("에러수\t\t전송수\t\t검출수\n") ; for(err_cnt=ERROR_STEP ; err_cnt<ERROR_MAX ; err_cnt+=ERROR_STEP) /* 시뮬레이션을 에러가 1개일때 6개 일때 11개일때... 31개일때 */ { count = 0 ; err_pos_gen(err_cnt) ; /* 에러가 발생할 자리를 미리 정한다. */ for(i=0 ; i<TEST_TIMES ; i++) { frame_gen(in_frame) ; crc = get_fcs(in_frame, FRAME_SIZE) ; memcpy(in_frame+FRAME_SIZE, &crc, sizeof(crc)) ; memcpy(out_frame, in_frame, TOTAL_SIZE) ; error_gen(out_frame, err_cnt) ; crc = get_fcs(out_frame, TOTAL_SIZE) ; if(crc != 0) count ++ ; } printf("%5d\t\t%5d\t\t%5d\n", err_cnt, i, count) ; } return( 0 ); } /******************************************************************/ /* void frame_gen(char *frame) ; */ /* 쓰임새 : 난수발생으로 임의의 데이터 전송 프레임을 만든다. */ /* 매개변수 : */ /* frame - 난수 발생으로 생성한 데이터 프레임이 저장될 주소 */ /* 반환값 : 없음. */ /******************************************************************/ void frame_gen(char *frame) { int i ; for(i=0 ; i<FRAME_SIZE ; i++) frame[i] = rand()%255 ; /* 0-255 사이의 난수 발생 */ } /******************************************************************/ /* void error_gen(char *frame, int err_cnt) ; */ /* 쓰임새 : 난수발생으로 임의의 에러를 생성한다. */ /* 매개변수 : */ /* frame - 데이터 프레임이 저장되어 있는 주소 */ /* err_cnt - 데이터 프레임에서 발생할 에러의 개수 */ /* 반환값 : 없음. */ /******************************************************************/ void error_gen(char *frame, int err_cnt) { int i=0, l, k ; for(i=0 ; i<err_cnt ; i++) { l = error_pos[i]/8 ; k = error_pos[i]%8 ; frame[l] = frame[l] ^ (1<<k) ; } /* 미리 결정한 에러가 발생할 자리의 비트를 반전시켜서 에러를 발생시킨다. */ } /******************************************************************/ /* void err_pos_gen(int err_cnt) ; */ /* 쓰임새 : 에러가 발생할 위치를 미리 결정해 놓는다. */ /* 속도문제 개선을 위해 미리 계산해 놓는다. */ /* 매개변수 : */ /* err_cnt - 에러가 발생할 개수 */ /* 반환값 : 없음. */ /******************************************************************/ void err_pos_gen(err_cnt) { int i, j, k ; for(i=0 ; i<err_cnt ; i++) { while(j!=i) { k = rand()%(TOTAL_SIZE*8) ; for(j=0 ; j<i ; j++) if(error_pos[j]==k) break ; error_pos[i] = k ; } } } /******************************************************************/ /* void crcgen(void) ; */ /* 쓰임새 : 바이트(256개)에 대한 CRC-32에 대한 나머지값들을 계산과정 */ /* 에서의 속도문제 개선을 위해 미리 계산해 놓는다. */ /* 매개변수 : 없음. */ /* 반환값 : 없음. */ /******************************************************************/ void crcgen(void) { unsigned long crc, poly; int i, j; poly = 0xEDB88320L; /* zmodem과 pkzip에서 사용되는 공개 폴리노미얼 */ for (i=0; i<256; i++) { crc = i; for (j=8; j>0; j--) { if (crc&1) { crc = (crc >> 1) ^ poly; /* 1이면, 뺀다. */ } else { crc >>= 1; /* 0이면, 쉬프트만 */ } } crcTable[i] = crc; } /* 8비트(256)에 해당하는 CRC의 나머지 값을 미리 계산해 놓는다. */ /* 최하위 비트가 그림에서의 최상위 비트가 된다. (역순으로 계산함...) */ } /******************************************************************/ /* void get_fcs(char *frame, int frame_size) ; */ /* 쓰임새 : 현재 프레임에 대한 FCS값(CRC 검사값)을 얻어온다. */ /* 매개변수 : */ /* frame - CRC를 check할 데이터 프레임. */ /* frame_size - 데이터 프레임의 크기. */ /* 반환값 : 없음. */ /******************************************************************/ int get_fcs(char *frame, int frame_size) { register unsigned long crc ; int b, i ; crc = 0xFFFFFFFF ; /* 데이터 프레임 전체를 하나의 M으로 보고 FCS를 계산한다. */ for(i=0 ; i<frame_size ; i++) crc = ((crc>>8) & 0x00FFFFFF) ^ crcTable[(crc^frame[i]) & 0xFF]; /* 들어온 바이트 만큼 쉬프트 시키면서 나머지를 계산해 나간다. */ return (crc^0xFFFFFFFF) ; /* 처음에 반전된 것을 원래대로 만든다. */ }
번호 | 분류 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|---|
863 | Develop | [c] 네트워크 정보 알아보기 | hooni | 2013.04.23 | 16246 |
» | Develop | [c] 오류체크(CRC 체크 ) 소스 2 | hooni | 2013.04.23 | 8236 |
861 | Etc | 개발자가 알아야할 10가지 보안팁으로 코드 보호하기 | hooni | 2013.04.23 | 16811 |
860 | Develop | [c] 오목.. 간단한 소스 ㅋㅋ | hooni | 2013.04.23 | 9716 |
859 | Develop | [c] vc++ 에서 clrscr(), gotoxy() 함수 사용하기.. | hooni | 2013.04.23 | 14358 |
858 | Develop | [c] 최단거리 알고리즘 & 예제소스.. 13 | hooni | 2013.04.23 | 10260 |
857 | Develop | [c] 격자 직사각형 넓이 구하기 | hooni | 2013.04.23 | 7594 |
856 | Develop | [vc++] 게임 소스 등.. ㅋㅋ | hooni | 2013.04.23 | 18520 |
855 | Develop | [js] get방식, url이후 모두 그대로 읽어오기.. | hooni | 2013.04.23 | 6917 |
854 | Develop | [web] URL 인코딩 방법.. 테이블.. ㅋㅋ | hooni | 2013.04.23 | 7842 |
853 | PPT | [ppt] Magic URLs & Hidden Form Fields 에 대해.. ㅋㅋ | hooni | 2013.04.23 | 12406 |
852 | Develop | [js] 툴팁.. 좋은거.. (tooltip) | hooni | 2013.04.23 | 7139 |
오류 5 error C2448: 'err_pos_gen' : 함수 스타일 이니셜라이저가 함수 정의처럼 나타납니다.
오류 2 error C3861: 'memcpy': 식별자를 찾을 수 없습니다.
오류 3 error C3861: 'memcpy': 식별자를 찾을 수 없습니다.
7 IntelliSense: 식별자 "err_cnt"이(가) 정의되어 있지 않습니다.
6 IntelliSense: 식별자 "memcpy"이(가) 정의되어 있지 않습니다.
경고 1 warning C4244: '인수' : 'time_t'에서 'unsigned int'(으)로 변환하면서 데이터가 손실될 수 있습니다.
이런 문제가 있는데 어떻게 해결해야 되나요ㅜㅜ