69,371
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///
///函数名称: crc()--CRC3检验函数
///Input: unsigned int data--传入32位数据,其中前29位是有效数据后3位是无效数据
///Outout: 无
///Return: unsigned int data--返回一个重新整理的32位数据,其中前29位是信息位后3位是CRC值
///说明: crc函数的功能是对传入的32位指令的有效数据进行CRC验证然后返回新的32位数据,
/// 其中前29位才是有效数据,后三位是无效数据。传入的数据格式应该为:前29位有效数据+后3位无效数据。
/// 返回新的32位数据格式为:前29位有效数据+后3位CRC值
///
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int crc(unsigned int data){
unsigned int crc3=3;
unsigned int len=32; //设置位数
unsigned int tData=0; //临时保存传入参数
unsigned int gx=0x0A; //crc3多项式 1010
unsigned int chk=0x01; //判断格式
unsigned int moveGx=4,moveChk=1; //Gx与Chk位长
unsigned int i =0;
data>>=crc3; //移除掉后面三位无效数据
tData=data;
moveGx=len-moveGx; //算出新位移
moveChk=len-moveChk;
tData<<=crc3; //都移到最高位,最高位对齐
gx<<=moveGx;
chk<<=moveChk;
for(i=0;i<29;i++) //遍历29位有效数据 最后循环结束后tData的就是所求的CRC值
{
if(chk & tData) //如果tData最高位是1
{
tData^=gx;
}
else
{}
gx>>=1; //不管tData最高位是1还是0.每次循环gx与chk都应该右移一位,让高位对齐
chk>>=1;
}
data<<=crc3; //应该Data最开始右移了三维去除了无效数据,根据函数要求,需要把有效数据放在前29位
data^=tData; //把CRC值放到data后3位
return data;
}
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int n=0X2b187a90,i=0,leng=29;
i=crc(n);
printf("%X",i);
return 0;
}