OneCompiler

CN errrr

123

// error detecting code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int *a, *b, *c;
int sizeOfA, sizeOfB, sizeOfC;
// string to int array
int *stringToIntArray(char *str, int *size)
{
int *arr = (int *)malloc(sizeof(int) * strlen(str));
int i = 0;
while (str[i] != '\0')
{
arr[i] = str[i] - '0';
i++;
}
*size = i;
return arr;
}
// checksum
void checksum()
{
char *temp;
int *sum;
printf("Sender side:\n");
int n;
printf("Enter the number of data bits: ");
scanf("%d", &n);
sizeOfA = n;
a = (int *)malloc(sizeOfA * sizeof(int));
temp = (char *)malloc((sizeOfA + 1) * sizeof(char));
printf("Enter the data bits: ");
scanf("%s", temp);
a = stringToIntArray(temp, &sizeOfA);
free(temp);
int m, parity, extra;
printf("Enter the block size: ");
scanf("%d", &m);
parity = m;
if (n % m == 0)
extra = 0;
else
extra = m - n % m;
sizeOfB = n + parity + extra;
b = (int *)malloc(sizeOfB * sizeof(int));

int count = 0;
for (int i = 0; i < sizeOfB; i++)
{
    if (extra <= i && i < sizeOfB - m)
        b[i] = a[i - extra];
    else
        b[i] = 0;
}
for (int i = m - 1; i < sizeOfB - m; i += m)
{
    int carry = 0;
    for (int j = i, k = sizeOfB - 1; j > i - m; j--, k--)
    {
        int t = (b[k] ^ b[j]) ^ carry;
        carry = (b[k] & b[j]) | (carry & (b[k] ^ b[j]));
        b[k] = t;
    }
    if (carry == 1)
    {
        int k;
        for (k = sizeOfB - 1; b[k] != 0 && k >= sizeOfB - m; k--)
            b[k] = 0;
        b[k] = 1;
    }
}
for (int i = sizeOfB - m; i < sizeOfB; i++)
    b[i] = !b[i];
printf("Data to be sent: ");
for (int i = 0; i < sizeOfA; i++)
    printf("%d", a[i]);
printf("\n");
printf("Data bits after adding parity bits: ");
for (int i = 0; i < sizeOfB; i++)
    printf("%d", b[i]);
printf("\n");

printf("Receiver side:\n");
printf("Enter the received data bits: ");
sizeOfC = sizeOfB + 1;
c = (int *)malloc(sizeOfC * sizeof(int));
temp = (char *)malloc(sizeOfC * sizeof(char));
scanf("%s", temp);
c = stringToIntArray(temp, &sizeOfC);
free(temp);

int error = 0;
sum = (int *)malloc(m * sizeof(int));
for (int i = 0; i < m; i++)
    sum[i] = 0;
for (int i = m - 1; i < sizeOfC; i += m)
{
    int carry = 0;
    for (int j = i, k = m - 1; j > i - m; j--, k--)
    {
        int t = (sum[k] ^ c[j]) ^ carry;
        carry = (sum[k] & c[j]) | (carry & (sum[k] ^ c[j]));
        sum[k] = t;
    }
    if (carry == 1)
    {
        int k;
        for (k = m - 1; sum[k] != 0; k--)
            sum[k] = 0;
        sum[k] = 1;
    }
}
for (int i = 0; i < m; i++)
    if (sum[i] == 0)
    {
        error = 1;
        break;
    }
if (error == 1)
    printf("Error detected\n");
else
    printf("No error detected\n");
free(a);
free(b);
free(c);
return;

}
// vertical redundancy check
void vrc()
{
char *temp;
printf("Sender side:\n");
int n;
printf("Enter the number of data bits: ");
scanf("%d", &n);
sizeOfA = n;
a = (int *)malloc(sizeOfA * sizeof(int));
temp = (char *)malloc((sizeOfA + 1) * sizeof(char));
printf("Enter the data bits: ");
scanf("%s", temp);
a = stringToIntArray(temp, &sizeOfA);
free(temp);
int m, parity, extra;
printf("Enter the block size: ");
scanf("%d", &m);
if (n % m == 0)
{
parity = n / m;
extra = 0;
}
else
{
parity = (n / m) + 1;
extra = m - n % m;
}
sizeOfB = n + parity + extra;
b = (int *)malloc(sizeOfB * sizeof(int));

int block_size = m, count = 0, j = 0;
for (int i = 0; i < sizeOfB; i++)
{
    if (i < extra)
    {
        b[i] = 0;
        block_size--;
    }
    else if (block_size == 0)
    {
        if (count % 2 == 0)
            b[i] = 0;
        else
            b[i] = 1;
        block_size = m;
        count = 0;
    }
    else
    {
        if (a[j] == 1)
            count++;
        b[i] = a[j++];
        block_size--;
    }
}
printf("Data to be sent: ");
for (int i = 0; i < sizeOfA; i++)
    printf("%d", a[i]);
printf("\n");
printf("Data bits after adding parity bits: ");
for (int i = 0; i < sizeOfB; i++)
    printf("%d", b[i]);
printf("\n");

printf("Receiver side:\n");
printf("Enter the received data bits: ");
sizeOfC = sizeOfB + 1;
c = (int *)malloc(sizeOfC * sizeof(int));
temp = (char *)malloc(sizeOfC * sizeof(char));
scanf("%s", temp);
c = stringToIntArray(temp, &sizeOfC);
free(temp);

int error = 0;
block_size = m;
count = 0;
for (int i = 0; i < sizeOfC; i++)
{
    if (block_size == 0)
    {
        if (count % 2 == 0 && c[i] == 1)
        {
            error = 1;
            break;
        }
        else if (count % 2 != 0 && c[i] == 0)
        {
            error = 1;
            break;
        }
        block_size = m;
        count = 0;
    }
    else
    {
        if (c[i] == 1)
            count++;
        block_size--;
    }
}
if (error == 1)
    printf("Error detected\n");
else
    printf("No error detected\n");
free(a);
free(b);
free(c);
return;

}
// longitudinal redundancy check
void lrc()
{
char *temp;
printf("Sender side:\n");
int n;
printf("Enter the number of data bits: ");
scanf("%d", &n);
sizeOfA = n;
a = (int *)malloc(sizeOfA * sizeof(int));
temp = (char *)malloc((sizeOfA + 1) * sizeof(char));
printf("Enter the data bits: ");
scanf("%s", temp);
a = stringToIntArray(temp, &sizeOfA);
free(temp);
int m, parity, extra;
printf("Enter the block size: ");
scanf("%d", &m);
parity = m;
if (n % m == 0)
extra = 0;
else
extra = m - n % m;
sizeOfB = n + parity + extra;
b = (int *)malloc(sizeOfB * sizeof(int));

int count = 0;
for (int i = 0; i < m; i++)
{
    for (int k = i; k < sizeOfB; k += m)
    {
        if (k < extra)
            b[k] = 0;
        else if (k >= (sizeOfA + extra))
        {
            if (count % 2 == 0)
                b[k] = 0;
            else
                b[k] = 1;
            count = 0;
        }
        else
        {
            if (a[k - extra] == 1)
                count++;
            b[k] = a[k - extra];
        }
    }
}
printf("Data to be sent: ");
for (int i = 0; i < sizeOfA; i++)
    printf("%d", a[i]);
printf("\n");
printf("Data bits after adding parity bits: ");
for (int i = 0; i < sizeOfB; i++)
    printf("%d", b[i]);
printf("\n");

printf("Receiver side:\n");
printf("Enter the received data bits: ");
sizeOfC = sizeOfB + 1;
c = (int *)malloc(sizeOfC * sizeof(int));
temp = (char *)malloc(sizeOfC * sizeof(char));
scanf("%s", temp);
c = stringToIntArray(temp, &sizeOfC);
free(temp);

int error = 0;
for (int i = 0; i < m; i++)
{
    count = 0;
    for (int k = i; k < sizeOfC; k += m)
    {
        if (k >= (sizeOfC - m))
        {
            if (count % 2 == 0 && c[k] == 1)
            {
                error = 1;
                break;
            }
            else if (count % 2 != 0 && c[k] == 0)
            {
                error = 1;
                break;
            }
        }
        else
        {
            if (c[k] == 1)
                count++;
        }
    }
}
if (error == 1)
    printf("Error detected\n");
else
    printf("No error detected\n");
free(a);
free(b);
free(c);
return;

}
// cyclic redundancy check
void crc()
{
char *temp;
printf("Sender side:\n");
int n;
printf("Enter the number of data bits: ");
scanf("%d", &n);
sizeOfA = n;
a = (int *)malloc(sizeOfA * sizeof(int));
temp = (char *)malloc((sizeOfA + 1) * sizeof(char));
printf("Enter the data bits: ");
scanf("%s", temp);
a = stringToIntArray(temp, &sizeOfA);

printf("Enter the key: ");
scanf("%s", temp);
int keysize = strlen(temp);
int *key = (int *)malloc(keysize * sizeof(int));
key = stringToIntArray(temp, &keysize);
free(temp);

sizeOfB = n + keysize - 1;
b = (int *)malloc(sizeOfB * sizeof(int));
for (int i = 0; i < sizeOfB; i++)
    if (i < sizeOfA)
        b[i] = a[i];
    else
        b[i] = 0;

for (int i = 0; i <= sizeOfB - keysize; i++)
{
    if (b[i] == 1)
        for (int j = 0; j < keysize; j++)
            b[i + j] = b[i + j] ^ key[j];
    else
        for (int j = 0; j < keysize; j++)
            b[i + j] = b[i + j] ^ 0;
    if (i < sizeOfA)
        b[i] = a[i];
}
printf("Data to be sent: ");
for (int i = 0; i < sizeOfA; i++)
    printf("%d", a[i]);
printf("\n");
printf("Data bits after adding parity bits: ");
for (int i = 0; i < sizeOfB; i++)
    printf("%d", b[i]);
printf("\n");

printf("Receiver side:\n");
printf("Enter the received data bits: ");
sizeOfC = sizeOfB + 1;
c = (int *)malloc(sizeOfC * sizeof(int));
temp = (char *)malloc(sizeOfC * sizeof(char));
scanf("%s", temp);
c = stringToIntArray(temp, &sizeOfC);
free(temp);

int error = 0;
for (int i = 0; i <= sizeOfC - keysize; i++)
{
    if (c[i] == 1)
        for (int j = 0; j < keysize; j++)
            c[i + j] = c[i + j] ^ key[j];
    else
        for (int j = 0; j < keysize; j++)
            c[i + j] = c[i + j] ^ 0;
}
for (int i = sizeOfC - keysize + 1; i < sizeOfC; i++)
    if (c[i] == 1)
    {
        error = 1;
        break;
    }
if (error == 1)
    printf("Error detected\n");
else
    printf("No error detected\n");
free(a);
free(b);
free(c);
return;

}
// hamming code
void hamming()
{
int n, r = 0;
printf("enter no. bits: ");
scanf("%d", &n);
while (pow(2, r) < n + r + 1)
r++;
int p = r--;
int b = n + p;
int data[b], error[p];
printf("Enter data: ");
for (int i = b - 1; i > -1; i--)
{
if (pow(2, r) == i + 1)
{
r--;
data[i] = 0;
}
else
scanf("%d", &data[i]);
}

for (int i = 1; i < b; i = i * 2)
{
    int count = 0;
    for (int j = i - 1; j < b; j++)
    {
        if ((i & (j + 1)) == i && data[j] == 1)
            count++;
    }
    if (count % 2 != 0)
        data[i - 1] = 1;
}
printf("Data sent: ");
for (int i = b - 1; i > -1; i--)
    printf("%d", data[i]);
printf("\n");

// reciver
int k = 0, x;
printf("Enter bit no. to be alter: ");
scanf("%d", &x);
if (data[x - 1] == 1)
    data[x - 1] = 0;
else
    data[x - 1] = 1;

printf("Data Recived: ");
for (int i = b - 1; i > -1; i--)
    printf("%d", data[i]);
printf("\n");

for (int i = 1; i < b; i = i * 2)
{
    int count = 0;
    for (int j = i - 1; j < b; j++)
    {
        if ((i & (j + 1)) == i && data[j] == 1)
            count++;
    }
    if (count % 2 == 0)
        error[k++] = 0;
    else
        error[k++] = 1;
}
printf("Error: ");
for (int i = p - 1; i > -1; i--)
    printf("%d", error[i]);
printf("\n");
return;

}
int main()
{
int choice;
while (1)
{
printf("1. checksum\n");
printf("2. vertical redundancy check\n");
printf("3. longitudinal redundancy check\n");
printf("4. cyclic redundancy check\n");
printf("5. hamming code\n");
printf("6. exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice)
{
case 1:
checksum();
break;
case 2:
vrc();
break;
case 3:
lrc();
break;
case 4:
crc();
break;
case 5:
hamming();
break;
case 6:
exit(0);
default:
printf("Invalid choice\n");
}
}
return 0;
}