您的位置:首页 > 其它

crc32校验48位mac 地址

2016-01-28 12:40 344 查看
//【用函数判断系统是Big Endian还是Little Endian】

//如果字节序为big-endian,返回true;

//反之为 little-endian,返回false

bool IsBig_Endian()

{

unsigned short test = 0x1234;

if(*( (unsigned char*) &test ) == 0x12)

return TRUE;

else

return FALSE;

}//IsBig_Endian()

//------------------------------------------------------------------------------

// 功 能:CRC32校验码程序

// 输入参数:48bit mac地址

// 返 回:

// temp(CRC32校验结果) or 0(输入mac地址错误)

//------------------------------------------------------------------------------

//方案一

uint32_t Mk_macaddr_crc32(uint64_t macaddr)

{

uint32_t POLY=0x04c11db7; //实际计算时,macaddr的最高位被移出,不参与计算,故移除生成多项式g(x)最高位1

unsigned char p[10];

uint32_t temp=0,idx=0;

uint8_t j=6;

memset(p, 0, sizeof(p));

do

{

p[6-j]=macaddr>>((j-1)*8) & 0xff;

// printf("\r\n0x%x",p[6-j]);

}while(--j);

// memcpy(p, &macaddr, 6);

for(int i=0;i<80;i++)//48bit 数据位+32bit 校验码

{

idx = i/8;

int hi = (temp>>31)&0x1;//获得temp的最高位,若为1则用temp除以g(x)

temp = (temp<<1)| (p[idx]>>7);

if(hi)

temp = temp^POLY;

p[idx]<<=1;

}

return temp;

}

Mk_macaddr_crc32(0x0180c2000000); //调用函数

结果为:DD538E55

方案二:

uint32_t Mk_macaddr_crc32( uint64_t macaddr )

{

uint32_t CRC32_table[256] = {0};

uint32_t CRC32_Value = 0xffffffff;//定义初始值;

uint8_t * pData = NULL;

uint8_t macaddr_temp[6] = {0};

uint8_t byte_num=6;

if(macaddr>>48 & 0xffff)

{

SendStr("Input macaddr Error!");

return MAC_CRC32_ERROR;

}

//用于生成CRC32_table

for (int i = 0; i != 256; i++)

{

uint32_t CRC = i;

for (int j = 0; j != 8; j++)

{

if (CRC & 1)

CRC = (CRC >> 1) ^ 0xEDB88320;

else

CRC >>= 1;

}

CRC32_table[i] = CRC;

}

//转换字节序

do

{

macaddr_temp[6-byte_num]=macaddr>>((byte_num-1)*8) & 0xff;

// printf("\r\n0x%x",macaddr_temp[6-byte_num]);

}while(--byte_num);

pData=macaddr_temp;

byte_num=6;

while (byte_num --)

{

CRC32_Value = CRC32_table[(CRC32_Value ^ *pData) & 0xFF] ^ (CRC32_Value >> 8);

pData++;

}

return CRC32_Value ;

}

Mk_macaddr_crc32(0x0180c2000000); //调用函数

输出结果:E8C31BE6
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: