I am trying to implement the algorithm of a CRC check, which basically created a value, based on an input message.
So, consider I have a hex message 3F214365876616AB15387D5D59, and I want to obtain the CRC24Q value of the message.
The algorithm that I found to do this is the following:
where *input=3F214365876616AB15387D5D59.
The problem is that ((*octets++) << 16) will shift by 16 bits the ascii value of the hex character and not the character itself.
So, I made a function to convert the hex numbers to characters.
I know the implementation looks weird, and I wouldn't be surprised if it were wrong.
This is the convert function:
SO:
Thank you very much for any suggestions.
So, consider I have a hex message 3F214365876616AB15387D5D59, and I want to obtain the CRC24Q value of the message.
The algorithm that I found to do this is the following:
Code:
typedef unsigned long crc24; crc24 crc_check(unsigned char *input) { unsigned char *octets; crc24 crc = 0xb704ce; // CRC24_INIT; int i; int len = strlen(input); octets = input; while (len--) { crc ^= ((*octets++) << 16); for (i = 0; i < 8; i++) { crc <<= 1; if (crc & 0x1000000) crc ^= CRC24_POLY; } } return crc & 0xFFFFFF; }
The problem is that ((*octets++) << 16) will shift by 16 bits the ascii value of the hex character and not the character itself.
So, I made a function to convert the hex numbers to characters.
I know the implementation looks weird, and I wouldn't be surprised if it were wrong.
This is the convert function:
Code:
char* convert(unsigned char* message) { unsigned char* input; input = message; int p; char *xxxx[20]; xxxx[0]=""; for (p = 0; p < length(message) - 1; p = p + 2) { char* pp[20]; pp[0] = input[0]; char *c[20]; *input++; c[0]= input[0]; *input++; strcat(pp,c); char cc; char tt[2]; cc = (char ) strtol(pp, &pp, 16); tt[0]=cc; strcat(xxxx,tt); } return xxxx; }
Code:
unsigned char *msg_hex="3F214365876616AB15387D5D59"; crc_sum = crc_check(convert((msg_hex))); printf("CRC-sum: %x\n", crc_sum);
Comment