哎 CRC还是CRC 求个CRC8的实现算法

MeBoss 2011-10-09 04:47:14
RT 需要一个CRC8的实现算法,不用查表的方式,最好有详细的注释吧,特别是关于位移的为什么需要那样位移,哎搞的头都大了,谢谢大家了
...全文
155 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
MeBoss 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 studycbc 的回复:]

不需要直接查表的有2种,一直半查表,另一种生成表,然后查询,举个16位的,8位的你需要上网找余式
C/C++ code

unsigned cal_crc(unsigned char *ptr, unsigned char len) {
unsigned int crc;
unsigned char da;
unsigne……
[/Quote]

请问 这的半查表的吗 ,我想看下查表的 16位的也行,不过最好是有注释下,谢谢了
七擒关羽 2011-10-09
  • 打赏
  • 举报
回复
不需要直接查表的有2种,一直半查表,另一种生成表,然后查询,举个16位的,8位的你需要上网找余式

unsigned cal_crc(unsigned char *ptr, unsigned char len) {
unsigned int crc;
unsigned char da;
unsigned int crc_ta[16]={ /* CRC余式表 */
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
}

crc=0;
while(len--!=0) {
da=((uchar)(crc/256))/16; /* 暂存CRC的高四位 */
crc<<=4; /* CRC右移4位,相当于取CRC的低12位)*/
crc^=crc_ta[da^(*ptr/16)]; /* CRC的高4位和本字节的前半字节相加后查表计算CRC,然后加上上一次CRC的余数 */
da=((uchar)(crc/256))/16; /* 暂存CRC的高4位 */
crc<<=4; /* CRC右移4位, 相当于CRC的低12位) */
crc^=crc_ta[da^(*ptr&0x0f)]; /* CRC的高4位和本字节的后半字节相加后查表计算CRC, 然后再加上上一次CRC的余数 */
ptr++;
}
return(crc);
}

MeBoss 2011-10-09
  • 打赏
  • 举报
回复
int xCal_crc(int *ptr,int len)
{int crc;
int i;
crc = 0;
while(len--)
crc ^= *ptr++;
for(i = 0;i < 8;i++)
{
if(crc & 0x01)
{
crc = (crc >> 1) ^ 0x8C;
}else crc >>= 1;
}
return crc;
}

我找到了一段这样的 但貌似不行啊

69,373

社区成员

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

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