1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

CRC24Q implementation

Discussion in 'C' started by imported_DDC, Sep 6, 2011.

  1. imported_DDC

    imported_DDC New Member

    Joined:
    Sep 6, 2011
    Messages:
    1
    Likes Received:
    0
    Trophy Points:
    0
    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.
     

Share This Page