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: 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; } 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: 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; } SO: Code: unsigned char *msg_hex="3F214365876616AB15387D5D59"; crc_sum = crc_check(convert((msg_hex))); printf("CRC-sum: %x\n", crc_sum); Thank you very much for any suggestions.