2007년 07월 31일
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)



![[수입] Sweet Sorrow - 바이올린 소품집 (비탈리: 샤콘느 등)](http://image.aladdin.co.kr/coveretc/music/coveroff/2742436145_1.jpg)



![[수입] Andrea B...](http://image.aladdin.co.kr/coveretc/music/coveroff/2712436883_1.jpg)






☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
(전혀 못알아먹는1人)