Structure Query Language, C programming, Java, Servlet, Jsp, Unix

Tuesday 12 June 2012

CRC CHECKSUM


[ SENDER SIDE ]
#include<stdio.h>
#include<fcntl.h>
#include<string.h>
int power(int no,int raise)
{
int ans=1,i;
for(i=0;i<raise;i++)
{
ans*=no;
}
return ans;
}
int toNum(char str[])
{
int i,sum=0,k=0;
for(i=strlen(str)-1;i>=0;i--)
{
if(str[i]=='1')
sum+=power(2,k);
k++;
}
return sum;
}
void xor(char no1[],char no2[],char temp[])
{
int i;
for(i=0;i<strlen(no1);i++)
{
if(no1[i] == no2[i])
temp[i]='0';
else
temp[i]='1';
}
}
void removeextra(char temp[],int len)
{
int pos,j=0,i;
char temp2[50];
strcpy(temp2,temp);
pos=strlen(temp2)-len;
for(i=pos;temp2[i]!='\0';i++)
temp[j++]=temp2[i];
temp[j]='\0';
}
void divide(char d1[],char str[],char temp[])
{
int i;
char zero[50];
for(i=0;i<strlen(d1);i++)
zero[i]='0';

if(toNum(str)>=toNum(d1))
xor(str,d1,temp);
else
xor(str,zero,temp);

removeextra(temp,strlen(d1)-1); //removing
}
void performdivision(char d1[],char d2[],char rem[])
{
char temp[50],str[50];
int lend1,lend2,i;
lend1=strlen(d1);
lend2=strlen(d2);

for(i=0;i<lend1;i++)
str[i]=d2[i];
str[i]='\0';

for(i=lend1;i<lend2;i++)
{
divide(d1,str,temp);
strcpy(str,temp);
str[strlen(str)]=d2[i];
str[strlen(str)+1]='\0';
temp[0]='\0';
}
strcpy(rem,str);
}
void add(char str1[],char str2[],char ans[])
{
int i,carry=0,sum;
for(i=strlen(str1)-1;i>=0;i--)
{
sum=carry+ (str1[i]-48) + (str2[i]-48);
if(sum>=2)
carry=1;
else
carry=0;
ans[i]=sum%2 + 48;
}
ans[strlen(str1)]='\0';
}
int tobinary(int num,int pos)
{
int code=1;
code=code << (pos-1);
if( code & num )
return 1;
else
return 0;
}
void main()
{
int lend1,lend2,i,k=0,num;
int pid;
char d1[48],d2[48],rem[48],ans[48];
system("clear");
system(">pipe");
pid=open("pipe",O_WRONLY);
printf("Enter divisor (both side must be 1): ");
scanf("%s",d1);
lend1=strlen(d1);
start:
printf("Enter divident (length must be >= %d) : ",lend1);
scanf("%s",d2);
if(strlen(d2)<lend1)
{
printf("\n...check size...\n");
goto start;
}

lend2=strlen(d2);
for(i=lend2; i<lend1+lend2-1; i++)
d2[i]='0';
d2[i]='\0';

printf("\nDIVISOR : %s",d1);
printf("\nDIVIDENT : %s",d2);
performdivision(d1,d2,rem);
printf("\nremainder : %s",rem);
num=toNum(rem);
for(i=strlen(d2);i>0;i--)
{
rem[k++]=tobinary(num,i) + 48;
}
rem[k]='\0';
add(d2,rem,ans);
printf("\nDATA TO SEND : %s ",ans);
write(pid,&d1,sizeof(d1));
write(pid,&ans,sizeof(ans));
}

[ RECEIVER SIDE ]

#include<stdio.h>
#include<fcntl.h>
#include<string.h>
int power(int no,int raise)
{
int ans=1,i;
for(i=0;i<raise;i++)
{
ans*=no;
}
return ans;
}
int toNum(char str[])
{
int i,sum=0,k=0;
for(i=strlen(str)-1;i>=0;i--)
{
if(str[i]=='1')
sum+=power(2,k);
k++;
}
return sum;
}
void xor(char no1[],char no2[],char temp[])
{
int i;
for(i=0;i<strlen(no1);i++)
{
if(no1[i] == no2[i])
temp[i]='0';
else
temp[i]='1';
}
}
void removeextra(char temp[],int len)
{
int pos,j=0,i;
char temp2[50];
strcpy(temp2,temp);
pos=strlen(temp2)-len;
for(i=pos;temp2[i]!='\0';i++)
temp[j++]=temp2[i];
temp[j]='\0';
}
void divide(char d1[],char str[],char temp[])
{
int i;
char zero[50];
for(i=0;i<strlen(d1);i++)
zero[i]='0';

if(toNum(str)>=toNum(d1))
xor(str,d1,temp);
else
xor(str,zero,temp);

removeextra(temp,strlen(d1)-1); //removing
}
void performdivision(char d1[],char d2[],char rem[])
{
char temp[50],str[50];
int lend1,lend2,i;
lend1=strlen(d1);
lend2=strlen(d2);

for(i=0;i<lend1;i++)
str[i]=d2[i];
str[i]='\0';

for(i=lend1;i<lend2;i++)
{
divide(d1,str,temp);
strcpy(str,temp);
str[strlen(str)]=d2[i];
str[strlen(str)+1]='\0';
temp[0]='\0';
}
strcpy(rem,str);
}
void main()
{
int pid,lend1,lend2,i,k=0,num,flag=1;
char d1[50],d2[50],rem[50],ans[50];
pid=open("pipe",O_RDONLY);
read(pid,&d1,sizeof(d1));
read(pid,&d2,sizeof(d2));
printf("\nDIVISOR : %s",d1);
printf("\nDIVIDENT : %s",d2);
performdivision(d1,d2,rem);
printf("\nremainder : %s",rem);
for(i=0;i<rem[i]!='\0';i++)
{
if(rem[i]=='1')
{
flag=0;
break;
}
}
if(flag==1)
printf("\nDATA ARRIVED CORRENCTLY");
else
printf("DATA ARRIVED INCORRECTELY");
printf("\nDATA TO SEND : %s ",ans);
}

No comments:

Post a Comment