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