CN errrr
// 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;
}