C Program help I am trying to complete a C program that does C R C calculation .
ID: 3604205 • Letter: C
Question
C Program help I am trying to complete a C program that does C R C calculation . I got everyting to work except a function to display binary difference at each X O R step .
the program compiles using two comand line arguments .
programName c [input Hex] : for calculation
programName v [input Hex] : for virification
The polynomial is always the same
here is how the output should look like :
Here is my code so far :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int i_temp=0;
char* pointer_stop;
int val =0;
char binary[50000][12];
char binary_string[50000];
int length=0;
int error=0;
char input[50000];
char lowercase[50000];
char chksm[50000];
char tester[50000];
char string_end[50000];
char *polynomial;
//HEX-BINARY
void HEXA_BIN(char *hexaDecimal)
{
long int i=0;
char block[5];
while(hexaDecimal[i])
{
switch(hexaDecimal[i])
{
case '0':
strcpy(block, "0000");
break;
case '1':
strcpy(block, "0001");
break;
case '2':
strcpy(block, "0010");
break;
case '3':
strcpy(block, "0011");
break;
case '4':
strcpy(block, "0100");
break;
case '5':
strcpy(block, "0101");
break;
case '6':
strcpy(block, "0110");
break;
case '7':
strcpy(block, "0111");
break;
case '8':
strcpy(block, "1000");
break;
case '9':
strcpy(block, "1001");
break;
case 'a':
strcpy(block, "1010");
break;
case 'b':
strcpy(block, "1011");
break;
case 'c':
strcpy(block, "1100");
break;
case 'd':
strcpy(block, "1101");
break;
case 'e':
strcpy(block, "1110");
break;
case 'f':
strcpy(block, "1111");
break;
}
i++;
strcat(binary_string, block);
}
}
void CrcChecker()
{
int i,p;
int c;
for(i=0; i<strlen(polynomial); i++)
chksm[i]= binary_string[i];
do
{
if(chksm[0]=='1')
{
for(c = 1; c < strlen(polynomial); c++)
{
if (chksm[c] == polynomial[c])
{
chksm[c] = '0';
}else chksm[c] = '1';
}
}
for(p=0; p<strlen(polynomial)-1; p++)
chksm[p]=chksm[p+1];
chksm[p]=binary_string[i++];
}
while(i<=length+strlen(polynomial)-1);
}
//BINARY-HEX
void BIN_HEXA(char *binary)
{
long int dec;
long int rm;
long int qt;
int i=1,j,temp;
char hx[50000];
dec = strtol (binary,NULL,2);
qt = dec;
while(qt!=0)
{
temp = qt % 16;
if( temp < 10)
{
temp =temp + 48;
}else temp = temp + 55;
hx[i++]= temp;
qt = qt / 16;
}
for(j = i -1 ; j> 0; j--)
printf("%c",hx[j]);
printf(" (hex)");
}
//MAIN
int main(int argc, char *argv[])
{
int i=0,e=0;
int i_line=0;
polynomial="1101";
polynomial="1100110110101";
int spacer=0;
strcpy(input, argv[2]);
printf("----------------------------------------------------------------------- ");
//CHOOSE CALC MODE
if (strcmp(argv[1], "c") == 0)
{
printf("The input string (hex): %s ", input);
for(i = 0; i<strlen(input); i++)
{
lowercase[i] = tolower(input[i]);
}
HEXA_BIN(lowercase);
printf("The input string (bin): " );
for(i=0; i<strlen(input)*4; i++)
{
printf("%c" , binary_string[i]);
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf(" ");
printf(" ");
printf("The polynomial that was used (binary bit string): ");
for(i=0; i<strlen(polynomial); i++)
{
printf("%c" , polynomial[i]);
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf(" ");
printf("Mode of operation: calculate ");
printf(" ");
printf("Number of zeroes that will be appended to the binary input : 12 ");
printf(" ");
printf("The binary string difference after each XOR step of the CRC calculation: ");
length = strlen(binary_string);
for(i=strlen(binary_string); i<(strlen(polynomial) + length) - 1; i++)
{
binary_string[i]='0';
}
//Calculate(binary_string, polynomial);
CrcChecker();
printf(" ");
i_line=0;
if (strlen(chksm) % 4 == 0)
{
printf("The CRC computed from the input : ");
for(i=0; i<strlen(chksm); i++)
{
printf("%c" , chksm[i]);
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf("(bin) = ");
BIN_HEXA(chksm);
printf(" ");
}
else
{
i_line=0;
printf("The CRC computed for the input is: 0");
for(i=0; i<strlen(chksm); i++)
{
printf("%c" , chksm[i]);
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf("(bin) = ");
BIN_HEXA(chksm);
printf(" ");
}
printf(" ");
}
//CHOOSE VERIFY MODE
else if (strcmp(argv[1], "v") == 0)
{
printf("The input string (hex): %s ", input);
for(i = 0; i<strlen(input); i++)
{
lowercase[i] = tolower(input[i]);
}
HEXA_BIN(lowercase);
printf("The input string (bin): " );
for(i=0; i<strlen(input)*4; i++)
{
printf("%c" , binary_string[i]);
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf(" ");
printf(" ");
printf("The polynomial that was used (binary bit string): ");
for(i=0; i<strlen(polynomial); i++)
{
printf("%c" , polynomial[i]);
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf(" ");
printf(" ");
printf(" Mode of operation: verification ");
printf(" The CRC observed at the end of the input: ");
i_line=0;
i_temp=0;
for(i=strlen(binary_string) - 12; i<strlen(binary_string); i++)
{
printf("%c" , binary_string[i]);
string_end[i_temp]=binary_string[i];
i_temp++;
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf("(bin) = ");
BIN_HEXA(string_end);
printf(" ");
length = strlen(binary_string);
for(i=strlen(binary_string) - 12; i<strlen(binary_string); i++)
{
binary_string[i]='0';
}
length = strlen(binary_string)-12;
CrcChecker();
printf(" ");
printf("The binary string difference after each XOR step of the CRC calculation: ");
i_line=0;
if (strlen(chksm) % 4 == 0)
{
printf("The CRC computed for the input : ");
for(i=0; i<strlen(chksm); i++)
{
printf("%c" , chksm[i]);
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf("(bin) = ");
BIN_HEXA(chksm);
printf(" ");
}
else
{
i_line=0;
printf("The CRC computed for the input : 0");
for(i=0; i<strlen(chksm); i++)
{
printf("%c" , chksm[i]);
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf("(bin) = ");
BIN_HEXA(chksm);
printf(" ");
}
printf(" ");
if(strcmp(chksm,string_end) == 0)
{
printf("Did the CRC check pass? (Yes or No): Yes ");
}
else
{
printf("Did the CRC check pass? (Yes or No): No ");
}
}
}
Explanation / Answer
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int i_temp=0;
char* pointer_stop;
int val =0;
char binary[50000][12];
char binary_string[50000];
int length=0;
int error=0;
char input[50000];
char lowercase[50000];
char chksm[50000];
char tester[50000];
char string_end[50000];
char *polynomial;
//HEX-BINARY
void HEXA_BIN(char *hexaDecimal)
{
long int i=0;
char block[5];
while(hexaDecimal[i])
{
switch(hexaDecimal[i])
{
case '0':
strcpy(block, "0000");
break;
case '1':
strcpy(block, "0001");
break;
case '2':
strcpy(block, "0010");
break;
case '3':
strcpy(block, "0011");
break;
case '4':
strcpy(block, "0100");
break;
case '5':
strcpy(block, "0101");
break;
case '6':
strcpy(block, "0110");
break;
case '7':
strcpy(block, "0111");
break;
case '8':
strcpy(block, "1000");
break;
case '9':
strcpy(block, "1001");
break;
case 'a':
strcpy(block, "1010");
break;
case 'b':
strcpy(block, "1011");
break;
case 'c':
strcpy(block, "1100");
break;
case 'd':
strcpy(block, "1101");
break;
case 'e':
strcpy(block, "1110");
break;
case 'f':
strcpy(block, "1111");
break;
}
i++;
strcat(binary_string, block);
}
}
void CrcChecker()
{
int i,p;
int c;
for(i=0; i<strlen(polynomial); i++)
chksm[i]= binary_string[i];
do
{
if(chksm[0]=='1')
{
for(c = 1; c < strlen(polynomial); c++)
{
if (chksm[c] == polynomial[c])
{
chksm[c] = '0';
}else chksm[c] = '1';
}
}
for(p=0; p<strlen(polynomial)-1; p++)
chksm[p]=chksm[p+1];
chksm[p]=binary_string[i++];
}
while(i<=length+strlen(polynomial)-1);
}
//BINARY-HEX
void BIN_HEXA(char *binary)
{
long int dec;
long int rm;
long int qt;
int i=1,j,temp;
char hx[50000];
dec = strtol (binary,NULL,2);
qt = dec;
while(qt!=0)
{
temp = qt % 16;
if( temp < 10)
{
temp =temp + 48;
}else temp = temp + 55;
hx[i++]= temp;
qt = qt / 16;
}
for(j = i -1 ; j> 0; j--)
printf("%c",hx[j]);
printf(" (hex)");
}
//MAIN
int main(int argc, char *argv[])
{
int i=0,e=0;
int i_line=0;
polynomial="1101";
polynomial="1100110110101";
int spacer=0;
strcpy(input, argv[2]);
printf("----------------------------------------------------------------------- ");
//CHOOSE CALC MODE
if (strcmp(argv[1], "c") == 0)
{
printf("The input string (hex): %s ", input);
for(i = 0; i<strlen(input); i++)
{
lowercase[i] = tolower(input[i]);
}
HEXA_BIN(lowercase);
printf("The input string (bin): " );
for(i=0; i<strlen(input)*4; i++)
{
printf("%c" , binary_string[i]);
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf(" ");
printf(" ");
printf("The polynomial that was used (binary bit string): ");
for(i=0; i<strlen(polynomial); i++)
{
printf("%c" , polynomial[i]);
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf(" ");
printf("Mode of operation: calculate ");
printf(" ");
printf("Number of zeroes that will be appended to the binary input : 12 ");
printf(" ");
printf("The binary string difference after each XOR step of the CRC calculation: ");
length = strlen(binary_string);
for(i=strlen(binary_string); i<(strlen(polynomial) + length) - 1; i++)
{
binary_string[i]='0';
}
//Calculate(binary_string, polynomial);
CrcChecker();
printf(" ");
i_line=0;
if (strlen(chksm) % 4 == 0)
{
printf("The CRC computed from the input : ");
for(i=0; i<strlen(chksm); i++)
{
printf("%c" , chksm[i]);
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf("(bin) = ");
BIN_HEXA(chksm);
printf(" ");
}
else
{
i_line=0;
printf("The CRC computed for the input is: 0");
for(i=0; i<strlen(chksm); i++)
{
printf("%c" , chksm[i]);
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf("(bin) = ");
BIN_HEXA(chksm);
printf(" ");
}
printf(" ");
}
//CHOOSE VERIFY MODE
else if (strcmp(argv[1], "v") == 0)
{
printf("The input string (hex): %s ", input);
for(i = 0; i<strlen(input); i++)
{
lowercase[i] = tolower(input[i]);
}
HEXA_BIN(lowercase);
printf("The input string (bin): " );
for(i=0; i<strlen(input)*4; i++)
{
printf("%c" , binary_string[i]);
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf(" ");
printf(" ");
printf("The polynomial that was used (binary bit string): ");
for(i=0; i<strlen(polynomial); i++)
{
printf("%c" , polynomial[i]);
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf(" ");
printf(" ");
printf(" Mode of operation: verification ");
printf(" The CRC observed at the end of the input: ");
i_line=0;
i_temp=0;
for(i=strlen(binary_string) - 12; i<strlen(binary_string); i++)
{
printf("%c" , binary_string[i]);
string_end[i_temp]=binary_string[i];
i_temp++;
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf("(bin) = ");
BIN_HEXA(string_end);
printf(" ");
length = strlen(binary_string);
for(i=strlen(binary_string) - 12; i<strlen(binary_string); i++)
{
binary_string[i]='0';
}
length = strlen(binary_string)-12;
CrcChecker();
printf(" ");
printf("The binary string difference after each XOR step of the CRC calculation: ");
i_line=0;
if (strlen(chksm) % 4 == 0)
{
printf("The CRC computed for the input : ");
for(i=0; i<strlen(chksm); i++)
{
printf("%c" , chksm[i]);
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf("(bin) = ");
BIN_HEXA(chksm);
printf(" ");
}
else
{
i_line=0;
printf("The CRC computed for the input : 0");
for(i=0; i<strlen(chksm); i++)
{
printf("%c" , chksm[i]);
i_line++;
if(i_line == 4)
{
i_line = 0;
printf(" ");
}
}
printf("(bin) = ");
BIN_HEXA(chksm);
printf(" ");
}
printf(" ");
if(strcmp(chksm,string_end) == 0)
{
printf("Did the CRC check pass? (Yes or No): Yes ");
}
else
{
printf("Did the CRC check pass? (Yes or No): No ");
}
}
}
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.