Develop
2013.04.23 13:08
[c] 오류체크(CRC 체크 ) 소스
조회 수 9088 댓글 2
CRC 체크 소스 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | /* 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) ; /* 처음에 반전된 것을 원래대로 만든다. */ } |
번호 | 분류 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|---|
325 | Develop |
[js] 스타크래프트(starcraft)..
![]() |
hooni | 2013.04.23 | 7400 |
324 | Develop |
[js] 툴팁.. 좋은거.. (tooltip)
![]() |
hooni | 2013.04.23 | 7743 |
323 | PPT |
[ppt] Magic URLs & Hidden Form Fields 에 대해.. ㅋㅋ
![]() |
hooni | 2013.04.23 | 13834 |
322 | Develop | [web] URL 인코딩 방법.. 테이블.. ㅋㅋ | hooni | 2013.04.23 | 12904 |
321 | Develop | [js] get방식, url이후 모두 그대로 읽어오기.. | hooni | 2013.04.23 | 7470 |
320 | Develop |
[vc++] 게임 소스 등.. ㅋㅋ
![]() |
hooni | 2013.04.23 | 18849 |
319 | Develop |
[c] 격자 직사각형 넓이 구하기
![]() |
hooni | 2013.04.23 | 8222 |
318 | Develop |
[c] 최단거리 알고리즘 & 예제소스..
13 ![]() |
hooni | 2013.04.23 | 11300 |
317 | Develop | [c] vc++ 에서 clrscr(), gotoxy() 함수 사용하기.. | hooni | 2013.04.23 | 14857 |
316 | Develop |
[c] 오목.. 간단한 소스 ㅋㅋ
![]() |
hooni | 2013.04.23 | 10344 |
315 | Etc | 개발자가 알아야할 10가지 보안팁으로 코드 보호하기 | hooni | 2013.04.23 | 17210 |
» | Develop | [c] 오류체크(CRC 체크 ) 소스 2 | hooni | 2013.04.23 | 9088 |
오류 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'(으)로 변환하면서 데이터가 손실될 수 있습니다.
이런 문제가 있는데 어떻게 해결해야 되나요ㅜㅜ