Contents

Develop
2013.04.23 13:08

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

조회 수 8112 댓글 2
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

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


?
  • ?
    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
번호 분류 제목 글쓴이 날짜 조회 수
321 Develop [js] get방식, url이후 모두 그대로 읽어오기.. hooni 2013.04.23 6841
320 Develop [vc++] 게임 소스 등.. ㅋㅋ file hooni 2013.04.23 18346
319 Develop [c] 격자 직사각형 넓이 구하기 file hooni 2013.04.23 7457
318 Develop [c] 최단거리 알고리즘 & 예제소스.. 13 file hooni 2013.04.23 10171
317 Develop [c] vc++ 에서 clrscr(), gotoxy() 함수 사용하기.. hooni 2013.04.23 14252
316 Develop [c] 오목.. 간단한 소스 ㅋㅋ file hooni 2013.04.23 9658
315 Etc 개발자가 알아야할 10가지 보안팁으로 코드 보호하기 hooni 2013.04.23 16401
» Develop [c] 오류체크(CRC 체크 ) 소스 2 hooni 2013.04.23 8112
313 Develop [c] 네트워크 정보 알아보기 file hooni 2013.04.23 16114
312 Develop [c] alarm()함수 설명과 간단한 예제 file hooni 2013.04.23 6669
311 Develop [c] selec()를 이용한 입출력 다중화 file hooni 2013.04.23 8259
310 Develop [c] 다중연결 서버 만들기 #4 - thread 사용 file hooni 2013.04.23 23699
Board Pagination Prev 1 ... 67 68 69 70 71 72 73 74 75 76 ... 98 Next
/ 98