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
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); } }