花各位1分钟时间,帮忙看下下面的代码写的对不对,谢谢了

MeBoss 2011-10-11 09:52:09
RT真的只要1分钟,我做了个CRC3的验证,请各位帮忙看下写的对不对啊,帮忙指点下,谢谢了


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


...全文
81 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
AndyZhang 2011-10-11
  • 打赏
  • 举报
回复
这个你运行一下,找个测试用例试一下就OK了,一般不会错吧

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧