C - CRC Encoder 배열을 이용한 초기버전(함수, 포인터 미사용)

//CRC Encoder 프로그램
//ASCII코드를 입력받고 인코드를 수행한다.

#include<stdio.h>
#include<stdlib.h>

int main()
{
    char Ascii_code;
    int dataword[8] = {0, }, codeword[11] = {0, }, divisor[4] = {0, }, remainder[3] = {0, }, table[9][3]= {0, };
    int i, j;
   
   
    printf("INPUT>");
    scanf("%c", &Ascii_code);
    for(i=7; i>=0; i--)
    {       
             dataword[i] = Ascii_code%2;
             Ascii_code/=2;
    }
    printf("Dataword : ");
    for(i=0; i<8; i++)
    {printf("%d ", dataword[i]);}
    printf("\n");
   
   
    printf("INPUT divisor>");
    for(j=0; j<4; j++)
    {
             scanf("%d", &divisor[j]);
    }
    if(divisor[0] == 0)
    {
                  printf("ERROR!!!\n");
                  system("PAUSE");
                  exit(0);
    }
   
    for(i=1; i<9; i++)
    {
          if(divisor[1]==1)
          table[i][0] = table[i-1][0]^table[i-1][1];
          else
          table[i][0] = 0^table[i-1][1];
         
          if(divisor[2]==1)
          table[i][1] = table[i-1][0]^table[i-1][2];
          else
          table[i][1] = 0^table[i-1][2];
         
          if(divisor[3]==1)
          table[i][2] = table[i-1][0]^dataword[i-1];
          else
          table[i][2] = 0^dataword[i-1];
    }
    for(j=0; j<3; j++)
    {
             remainder[j] = table[8][j];
             printf("%d ", remainder[j]);
    }
    printf("\n");
    for(i=0; i<11; i++)
    {
             if(i<8)
             codeword[i] = dataword[i];
             else
             codeword[i] = remainder[i-8];
            
             printf("%d ", codeword[i]);
    }
    printf("\n");
    system("PAUSE");
    return 0;
}


변수 :
    char Ascii_code;
    int dataword[8] = {0, }, codeword[11] = {0, }, divisor[4] = {0, }, remainder[3] = {0, }, table[9][3]= {0, };
    int i, j;
문자를 입력받는 Ascii_code,
아스키코드를 이진화화여 배열로 저장하는 dataword,
remainder를 붙여 최종적으로 전송하게되는 codeword,
dataword와 divisor를 계산하는 틀이 될 table.

입력 :
    for(i=7; i>=0; i--)
    {       
             dataword[i] = Ascii_code%2;
             Ascii_code/=2;
    }
(i=7; i>=0; i--) <= 이부분에 주의. 배열에 거꾸로 집어 넣어야 한다.
    printf("INPUT divisor>");
    for(j=0; j<4; j++)
    {
             scanf("%d", &divisor[j]);
    }
    if(divisor[0] == 0)
    {
                  printf("ERROR!!!\n");
                  system("PAUSE");
                  exit(0);
    }
divisor를 입력받는다. 여기서는 4자리로 한다. 입력시 띄어쓰기로 각 자리수를 구별한다.
divisor의 첫번째 자리는 1이 되어야 하기 때문에 배열의 첫번째 인덱스에 0이 입력되면 프로그램을 종료한다.

계산 :
    for(i=1; i<9; i++)
    {
          if(divisor[1]==1)
          table[i][0] = table[i-1][0]^table[i-1][1];
          else
          table[i][0] = 0^table[i-1][1];
         
          if(divisor[2]==1)
          table[i][1] = table[i-1][0]^table[i-1][2];
          else
          table[i][1] = 0^table[i-1][2];
         
          if(divisor[3]==1)
          table[i][2] = table[i-1][0]^dataword[i-1];
          else
          table[i][2] = 0^dataword[i-1];
    }
divisor가 0일경우 0과 XOR하기때문에 if문으로 구별한다.

    for(j=0; j<3; j++)
    {
             remainder[j] = table[8][j];
             printf("%d ", remainder[j]);
    }
Generator의 계산 결과를 remainder변수에 저장한다. 하지만 안해도 된다.

    for(i=0; i<11; i++)
    {
             if(i<8)
             codeword[i] = dataword[i];
             else
             codeword[i] = remainder[i-8];
            
             printf("%d ", codeword[i]);
    }
전송될 codeword변수를 정의하고 화면에 출력한다.

다음번에는 함수와 포인터를 사용하고 divisor를 최대 32자리까지 받을 수 있으며 디코더를 포함하는 완전체(?)를 만든다.

참고자료 - 데이터통신에서 스캔

by 퓨리넬 | 2007/07/31 12:09 | 프로그래밍수련 | 트랙백 | 덧글(1)

트랙백 주소 : http://p5ydhcw.egloos.com/tb/3648159
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 세상비관소년 at 2007/08/02 00:20
뭐야 이거...무셔...
(전혀 못알아먹는1人)

:         :

:

비공개 덧글

◀ 이전 페이지 다음 페이지 ▶