calculation of 32 bit CRC(Cyclic Redundancy Code)in C

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • khatavkar
    New Member
    • Nov 2009
    • 3

    calculation of 32 bit CRC(Cyclic Redundancy Code)in C

    please help me!!
    i have written a program to calculate 32 bit CRC(used for ETHERNET)..but its not working and giving correct output..
    please let me know my mistakes..

    output should be :E7 B0 51 93
    Code:
    /**************  program starts here *************************/
    typedef unsigned long ul;
    typedef unsigned char uchar;
    
    uchar buffer_bytes[64] = {0x00,0x14,0x85,0x31,0x24,0x10,0x00,0x15,0x00,0x15,0x9f,0x07,0x08,0x06,0x00,0x01,0x08,0x00,0x06,0x04,0x00,0x02,0x00,0x15,0x00,0x15,0x9f,0x07,0xc0,0xa8,0x00,0x02,0x00,0x14,0x85,0x31,0x24,0x10,0xc0,0xa8,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    ul 	remainder ,temp;		//to get 32 bit number
    unsigned short weld,joint;
    
    unsigned char i,count = 0 ,str_length =64,  *ptr,j;
    
    
    #define MSB 0x80000000;
    #define POLY 0x04C11DB7	
    #define printf printf_fast_f
    
    void init_uart(void)
    {
    	ES = 0 ;                    //Disable serial interrupt.
    	SCON = 0x50 ;				//mode 0,REN enabled
    	BDRCON = 0x0E ;				//
    	
    	PCON &= 0x7F ;
    	BRL = 224 ;
    	BDRCON |= 0x10 ;	
    }
    
    void putchar(uchar send_this)
    {
    	uart_send_char(send_this);
    }
    
    void main(void)
    {
    	init_uart();
    
    	ptr = &buffer_bytes[0];
    	
    	//----------------------------------------------------------------------------------------------------------/
    	//			get 32 bit number out of the whole string 														/
    	//----------------------------------------------------------------------------------------------------------/
    	weld = (unsigned short)*ptr;																							   	
    	ptr++;																									  						
    	weld = ((weld << 8) & 0xff00) +  (unsigned short)*ptr;		//16 bit number higher											
    	ptr++;
    	joint =  (unsigned short)*ptr;
    	ptr ++;
    	
    	joint = ((joint << 8) &0xff00) + (unsigned short) *ptr	;	//16 bit number lower
    	ptr ++;														//pointer points the next byte after 4th byte
    	remainder =  weld;
    	remainder = (remainder << 16) & 0xffff0000  ;		
    	remainder = remainder + joint;									//32 bit number
    	
    	
    	//remainder = remainder ^ (ul) 0xFFFFFFFF;
    //----------------------------------------------------------------------------------------------------
    
    	//str_length = str_length  - 4;
    
    	for(j = str_length; j>0 ; j--)					//str_length = no. of bytes in string
    	{
    		if((remainder & (ul)0xFF000000)==0x00000000)
    		{
    			remainder = remainder << 8;
    			remainder = (remainder & (ul)0xFFFFFF00) | (ul)*ptr;
    		}
    		else
    		{
    			for(i=0; i<8 ; i++)
    			{
    			printf(" %lx\r\n",remainder);
    				if((remainder & (ul)0x80000000) == (ul)0x80000000)		//if MSB is high then shift left by 1, get next bit 0
    				{														
    					remainder = remainder << 1;
    					
    					if((*ptr & 0x80) == 0x80)
    					{
    						remainder |= (ul)0x00000001;
    					}
    					else 
    					{
    						remainder |= (ul)0x00000000;
    					}
    					*ptr = *ptr << 1;							//XOR remainder with POLY
    					printf("msg %lx\r\n",remainder);
    					
    					remainder = remainder ^ (ul)0x04C11DB7;
    					printf("XOR abov msg wiD POLY\r\n");
    				}
    				else
    				{
    				
    				//	while((remainder & (ul)0x80000000) == (ul)0x00000000)
    				//	{
    						remainder = remainder << 1;
    						if((*ptr & 0x80) == 0x80)
    						{
    							remainder |= (ul)0x00000001;
    						}
    						else
    						{ 
    							remainder |= (ul)0x00000000;
    						}
    						*ptr = *ptr << 1;
    				//		i++;
    				//		if (i >= 8)break;
    					//}
    					
    				}
    			}
    			ptr ++;
    			//printf("ptr = %2x\r\n",*ptr);
    		}
    	}
    Last edited by Banfa; Jan 11 '10, 12:37 PM. Reason: Added code tags
Working...