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
//如果字节序为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
相关文章推荐
- linux内核启动流程分析
- [解析苹果官方文档]之[UIView Class Reference]
- 数组
- 测试设计中需要考虑的22种测试类型
- 二叉排序树(创建,查找,删除)
- js定时执行
- Centos 6.5 安装FTP服务
- MonogoDb的角色分类
- 【Win 10应用开发】响应系统回退键的导航事件
- 【转】Objective-C消息机制的原理
- PHP实现过滤各种HTML标签
- iOS 动态改变cell的高度
- Hibernate各种主键生成器策略与配置详解(转载)
- iOS开发之UILabel动态高度设置方法
- 伸展树学习小结
- CentOS7 网络配置
- 今天上午算是做最后的公司退出
- 第三章 Webdriver Java API简介(上)
- php中curl请求报错:Problem with the SSL CA cert (path? access rights?)
- 电力载波芯片ST7538Q调试记录2