08 March, 2014

Humming Code

Humming Code Receiver


#include<stdio.h>
#include<fcntl.h>
main()
{
    int fd,i,ind;
    char data[11],ch;

    if((fd=open("testfile",O_RDONLY))<=0)
        perror("File open failed");
   
    while(1)
    {
        if((i=read(fd,data,11))<=0)
            break;

        for(i=10;i>=0;i--)
        {
            printf("%c",data[i]);
        }
        hammingCode(data);
        ind=8;

        for(i=0;i<11;i++)
        {
           
            if(i!=0 && i!=1 && i!=3 && i!=7)
            {
                if(data[i]=='1')
                {
                    ch=setBit(ch,ind--);
                }
                else
                {
                    ch=unSetBit(ch,ind--);
                }
            }
        }
        ch=unSetBit(ch,1);
        printf("%c",ch);
        printf("\n");
    }
}
void displayBit(char ch)
{
    int no=128;
    int i;

    for(i=0;i<8;i++)
    {
        if((no&ch)>0)
            printf("1");
        else
            printf("0");
       
        no=no>>1;
    }
}
char setBit(char ch,int pos)
{
    int no=128;
   
    no=no>>(pos-1);
   
    return ch|no;

}
char unSetBit(char ch,int pos)
{
    int no=128;
   
    no=no>>(pos-1);

    no=~no;

    return ch&no;
}
void hammingCode(char data[])
{
   
    int one=0,two=0,three=0,four=0,i;   

    for(i=1;i<=11;i++)
    {
        if((i==1 || i==3 || i==5 || i==7 || i==9 || i==11) && (data[i-1]=='1'))
        {
            one++;
        }
        if((i==2 || i==3 || i==6 || i==7 || i==10 || i==11) &&(data[i-1]=='1'))
        {
            two++;
        }
        if((i==4 || i==5 || i==6 || i==7) && (data[i-1]=='1'))
        {
            three++;
        }
        if((i==8 || i==9 || i==10 || i==11) && (data[i-1]=='1'))
        {
            four++;
        }
    }
   
    if(one%2==0 && two%2==0 && three%2==0 && four%2==0)
        printf("\tValid Data - \t");
    else
    {
        int pos=0;

        if(one%2!=0)
        {
            pos++;
        }
        if(two%2!=0)
        {
            pos+=2;
        }
        if(three%2!=0)
        {
            pos+=4;
        }   
        if(four%2!=0)
        {
            pos+=8;
        }
       
        printf("Error detected at bit %d",pos);

        if(data[pos]==0)
            data[pos]='1';
        else
            data[pos]='0';
        printf("\nCorrected Data is: ");
    }
   
}



Humming Code Sender


#include<stdio.h>
#include<fcntl.h>

void displayBit(char ch);
char* hammingCode(char ch);
char getBit(char ch,int pos);

main()
{
    int fd,fd1,i,j;
    char ch,*data;

    if((fd=open("testfile",O_WRONLY))<=0)
        perror("File open failed");
   
    if((fd1=open("input.txt",O_RDONLY))<=0)
        perror("File open failed");

    while(1)
    {
        if((i=read(fd1,&ch,1))<=0)
            break;
        if(ch==10)
            break;

        printf("\nchar is: %c -",ch);
        displayBit(ch);

        data=hammingCode(ch);
        printf("\n\nSender\n:");

        for(i=10;i>=0;i--)
        {
            printf("%c",data[i]);
        }   
       
        if((i=write(fd,data,11))<=0)
            break;

        free(data);
       
    }
   
}
void displayBit(char ch)
{
    int no=128;
    int i;

    for(i=0;i<8;i++)
    {
        if((no&ch)>0)
            printf("1");
        else
            printf("0");
       
        no=no>>1;
    }
}
char getBit(char ch,int pos)
{
    int no=128;

    no=no>>(pos-1);

    if((no&ch)>0)
        return '1';
    else
        return '0';
}
char* hammingCode(char ch)
{
    char *data=(char *)malloc(sizeof(char)*11);
   
    int one=0,two=0,three=0,four=0,i;   

    data[0]='0';    //1st
    data[1]='0';    //2nd

    data[2]=getBit(ch,8);

    data[3]='0';    //4th

    data[4]=getBit(ch,7);
    data[5]=getBit(ch,6);
    data[6]=getBit(ch,5);

    data[7]='0';    //8th

    data[8]=getBit(ch,4);
    data[9]=getBit(ch,3);
    data[10]=getBit(ch,2);


    for(i=1;i<=11;i++)
    {
        if((i==1 || i==3 || i==5 || i==7 || i==9 || i==11) && (data[i-1]=='1'))
        {
            one++;
        }
        if((i==2 || i==3 || i==6 || i==7 || i==10 || i==11) &&(data[i-1]=='1'))
        {
            two++;
        }
        if((i==4 || i==5 || i==6 || i==7) && (data[i-1]=='1'))
        {
            three++;
        }
        if((i==8 || i==9 || i==10 || i==11) && (data[i-1]=='1'))
        {
            four++;
        }
    }
   
    if(one%2!=0)
        data[0]='1';

    if(two%2!=0)
        data[1]='1';

    if(three%2!=0)
        data[3]='1';

    if(four%2!=0)
        data[7]='1';

    return data;
}