Contents

Develop
2013.04.23 13:08

[c] 오류체크(CRC 체크 ) 소스

조회 수 9088 댓글 2
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

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) ;
    /* 처음에 반전된 것을 원래대로 만든다. */
}


?
  • ?
    kt 2018.05.12 15:28
    오류 4 error C2065: 'err_cnt' : 선언되지 않은 식별자입니다.
    오류 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'(으)로 변환하면서 데이터가 손실될 수 있습니다.
    이런 문제가 있는데 어떻게 해결해야 되나요ㅜㅜ
  • profile
    hooni 2018.05.12 15:58
    안녕하세요,
    플랫폼(OS)과 컴파일러 환경에 따라 오류가 날 수도 있습니다.
    정확한 환경을 알려주시면 확인해보겠습니다.
    방금 Mac, Linux 에서 확인했는데 오류 없이 잘 컴파일/실행 됩니다.

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
325 Develop [js] 스타크래프트(starcraft).. file hooni 2013.04.23 7400
324 Develop [js] 툴팁.. 좋은거.. (tooltip) file hooni 2013.04.23 7743
323 PPT [ppt] Magic URLs & Hidden Form Fields 에 대해.. ㅋㅋ file 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++] 게임 소스 등.. ㅋㅋ file hooni 2013.04.23 18849
319 Develop [c] 격자 직사각형 넓이 구하기 file hooni 2013.04.23 8222
318 Develop [c] 최단거리 알고리즘 & 예제소스.. 13 file hooni 2013.04.23 11300
317 Develop [c] vc++ 에서 clrscr(), gotoxy() 함수 사용하기.. hooni 2013.04.23 14857
316 Develop [c] 오목.. 간단한 소스 ㅋㅋ file hooni 2013.04.23 10344
315 Etc 개발자가 알아야할 10가지 보안팁으로 코드 보호하기 hooni 2013.04.23 17210
» Develop [c] 오류체크(CRC 체크 ) 소스 2 hooni 2013.04.23 9088
Board Pagination Prev 1 ... 67 68 69 70 71 72 73 74 75 76 ... 99 Next
/ 99

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

나눔고딕 사이트로 가기

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5