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