CRC Receiver
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct frame
{
char info[1];
char rem[1];
}r;
void dispBits(char c);
int getBit(char c,int pos);
char setBit(char c,int pos);
char unsetBit(char c,int pos);
main()
{
int tmp;
int fd,file1;
int d=13; // div by 1101 (13)
if((fd=open("testfile",O_RDONLY))<0)
perror("fifo open failed");
if((file1=open("output.txt",O_WRONLY))<0)
perror("file open failed");
while(1)
{
if((tmp=read(fd,r.info,1))>0)
{
int i,j,tmp;
char ans=0,trem;
if((tmp=read(fd,r.rem,1))<=0)
break;
//printf("\n receive data : ");
//dispBits(r.info[0]);
//printf("\t remainder : ");
//dispBits(r.rem[0]);
trem=0;
for(i=1;i<=8+3;i++) //8 data bit and 3 for 000
{
trem=trem<<1; //for reminder
ans=ans<<1;
if(i<=8) //data part
{
if(getBit(r.info[0],i)==1)
trem=setBit(trem,8);
else
trem=unsetBit(trem,8);
}
else // last 3 bit of received remainder
{
if(getBit(r.rem[0],i-3)==1)
trem=setBit(trem,8);
else
trem=unsetBit(trem,8);
}
if(getBit(trem,5)==1) //if divide then
{
trem=trem^d;
ans=setBit(ans,8);
}
}
printf("\n [receiver] division ans : ");
dispBits(ans);
printf("\t remainder : ");
dispBits(trem);
if(trem==0)
{
if((tmp=write(file1,r.info,1))<=0) //send char
perror("message write failed");
}
else
{
printf("\nERROR :: Error in Received data");
}
}
}
printf("\n");
}
void dispBits(char c)
{
int no=128,i;
for(i=0;i<8;i++)
{
if((no&c)>0)
printf("1");
else
printf("0");
no=no>>1;
}
}
int getBit(char c,int pos)
{
int no=128;
no=no>>(pos-1);
if((c&no)>0)
return 1;
else
return 0;
}
char setBit(char c,int pos)
{
int no=128;
no=no>>(pos-1);
c=c|no;
return c;
}
char unsetBit(char c,int pos)
{
int no=128;
no=no>>(pos-1);
no=~no;
return c&no;
}
CRC Sender
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct frame
{
char info[1];
char rem[1];
}s;
void dispBits(char c);
int getBit(char c,int pos);
char setBit(char c,int pos);
char unsetBit(char c,int pos);
main()
{
int fd,file1;
int d=13; // div by 1101 (13)
if((fd=open("testfile",O_WRONLY))<0)
perror("fifo open failed");
if((file1=open("input.txt",O_RDONLY))<0)
perror("file open failed");
while(1)
{
int i,j,tmp;
char ans=0;
if((tmp=read(file1,s.info,1))<=0)
break;
if(s.info[0]==10)
break;
printf("\n\n Input : ");
dispBits(s.info[0]);
s.rem[0]=0;
for(i=1;i<=8+3;i++) //8 data bit and 3 for 000
{
s.rem[0]=s.rem[0]<<1; //for reminder
ans=ans<<1;
if(i<=8) //data part
{
if(getBit(s.info[0],i)==1)
s.rem[0]=setBit(s.rem[0],8);
else
s.rem[0]=unsetBit(s.rem[0],8);
}
else // last 000
{
s.rem[0]=unsetBit(s.rem[0],8);
}
if(getBit(s.rem[0],5)==1) //if divide then
{
ans=setBit(ans,8);
s.rem[0]=s.rem[0]^d;
}
}
printf("\n [sender] division ans : ");
dispBits(ans);
printf("\t remainder : ");
dispBits(s.rem[0]);
if((tmp=write(fd,s.info,1))<=0) //send char
perror("message write failed");
if((tmp=write(fd,s.rem,1))<=0) //send remainder
perror("message write failed");
}
printf("\n");
}
void dispBits(char c)
{
int no=128,i;
for(i=0;i<8;i++)
{
if((no&c)>0)
printf("1");
else
printf("0");
no=no>>1;
}
}
int getBit(char c,int pos)
{
int no=128;
no=no>>(pos-1);
if((c&no)>0)
return 1;
else
return 0;
}
char setBit(char c,int pos)
{
int no=128;
no=no>>(pos-1);
c=c|no;
return c;
}
char unsetBit(char c,int pos)
{
int no=128;
no=no>>(pos-1);
no=~no;
return c&no;
}