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

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice