请教C问题 下面 校验和的实现 看不懂!

[复制链接]
2092|4
 楼主| itelectron 发表于 2009-11-9 11:07 | 显示全部楼层 |阅读模式
/*******************************/
/*  Verify check sum  */
/*******************************/
Uart_Printf("Now, Checksum calculation\n");
cs=0;
i=(downloadAddress);
j=(downloadAddress+downloadFileSize-10)&0xfffffffc;
while(i<j)
{
  temp=*((U32 *)i);
  i+=4;
  cs+=(U16)(temp&0xff);
  cs+=(U16)((temp&0xff00)>>8);
  cs+=(U16)((temp&0xff0000)>>16);
  cs+=(U16)((temp&0xff000000)>>24);
}
i=(downloadAddress+downloadFileSize-10)&0xfffffffc;
j=(downloadAddress+downloadFileSize-10);
while(i<j)
{
    cs+=*((U8 *)i++);
}
checkSum=cs;
dnCS=*((unsigned char *)(downloadAddress+downloadFileSize-8-2))+
(*( (unsigned char *)(downloadAddress+downloadFileSize-8-1) )<<8);
if(checkSum!=dnCS)
{
  Uart_Printf("Checksum Error!!! MEM:%x DN:%x\n",checkSum,dnCS);
  return;
}
ejack 发表于 2009-11-9 12:20 | 显示全部楼层
哪里看不懂?
stm_zy 发表于 2009-11-9 13:52 | 显示全部楼层
  1. /*******************************/
  2. /*  Verify check sum  */
  3. /*******************************/
  4. Uart_Printf("Now, Checksum calculation\n");//这个不用解释了吧
  5. cs=0;  //这里是初始化cs
  6. i=(downloadAddress);//把downloadAddress赋给i,从上下文来看,i应该是地址指针
  7. j=(downloadAddress+downloadFileSize-10)&0xfffffffc;//指定截止地址
  8. while(i<j)//判断地址是否超出待校验的地址范围,未超出就继续执行以下代码
  9. {
  10.   temp=*((U32 *)i);//取出地址i内的数据(32位)
  11.   i+=4;//将地址加4,即指向下一个32位的数据

  12. //以下4句是将该32位的数据按字节累加
  13.   cs+=(U16)(temp&0xff);
  14.   cs+=(U16)((temp&0xff00)>>8);
  15.   cs+=(U16)((temp&0xff0000)>>16);
  16.   cs+=(U16)((temp&0xff000000)>>24);
  17. }

  18. //将上面的截止地址赋给i,继续校验剩余的字节.
  19. i=(downloadAddress+downloadFileSize-10)&0xfffffffc;
  20. j=(downloadAddress+downloadFileSize-10);
  21. while(i<j)
  22. {
  23.     cs+=*((U8 *)i++);//将剩余字节累加到cs中。
  24. }
  25. checkSum=cs;//将cs的值赋给checkSum

  26. //将待校验字段的倒数第10字节和第9字节组合成一个16位数并赋给dnCS
  27. dnCS=*((unsigned char *)(downloadAddress+downloadFileSize-8-2))+
  28. (*( (unsigned char *)(downloadAddress+downloadFileSize-8-1) )<<8);

  29. //对比checkSum和dnCS,若它们不等,就认为是校验错误
  30. if(checkSum!=dnCS)
  31. {
  32.   Uart_Printf("Checksum Error!!! MEM:%x DN:%x\n",checkSum,dnCS);
  33.   return;
  34. }
 楼主| itelectron 发表于 2009-11-9 14:13 | 显示全部楼层
谢谢楼上请问怎么给分啊
stm_zy 发表于 2009-11-9 14:32 | 显示全部楼层
如何给帖子结帖,结帖如何给分?
提问后,请您切记在30天内处理您的问题,否则将辜负回答您问题的热心网友,系统会定期强制结贴并不返回帖主可用分。您可以点击帖子左上方的“我要结贴”按钮,每个帖子后会自动出现给分框,可以进行如下操作:

点击结贴给分:
当您的问题得到解答,请给回答者相应的分数,来结束该帖。(在回答者所在楼层右边直接填写分数,然后提交)。您可以选择一个您最满意的回答为最佳答案或者根据回答者的答案分别给出悬赏分以内的分数(其和不能大于悬赏分,系统会自动帮您计算):
1)被采纳的回答被您选为问题的答案;这时问题的状态变为“已解决”,
2)被采纳的回答者可获得您悬赏出去的积分。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:MARK: zhi kan ji shu

274

主题

2761

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部