请问这个函数是什么意思?

2019-08-14 00:12发布

int memcpy_from_eeprom_with_checksum(char *destination, unsigned int source, unsigned int size) {
  unsigned char data, checksum = 0;
  for(; size > 0; size--) {
    data = eeprom_get_char(source++);
    checksum = (checksum << 1) || (checksum >> 7);
    checksum += data;   
    *(destination++) = data;
  }
  return(checksum == eeprom_get_char(source));
}

这个函数中的 checksum = (checksum << 1) || (checksum >> 7);
是什么意思,实现了什么算法。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
jiutianshenjian
1楼-- · 2019-08-14 06:06
本帖最后由 jiutianshenjian 于 2017-9-15 16:49 编辑

将eeprom起始地址source读取到destination开始的内存空间,读size个。
这个校验和是最后一个字节读出来跟自己计算的比较的。相等返回1,不相等返回0.
假如程序没贴错。
checksum = (checksum << 1) || (checksum >> 7)
每次读出一个字节后,校验和要么加1要么加0.
上次校验和全0才加0,其他都加1.

xuande
2楼-- · 2019-08-14 11:46
 精彩回答 2  元偷偷看……
csmjmcc
3楼-- · 2019-08-14 14:30
本帖最后由 csmjmcc 于 2017-9-15 16:04 编辑

把checksum最高位BIT7放到最低位BIT0?不懂为何这样做,啥高级算法?保留进位?
jiutianshenjian
4楼-- · 2019-08-14 16:46
他是逻辑或||,不是|。
meimengxing2014
5楼-- · 2019-08-14 17:57
这个函数的功能是把EEPROM中的数据复制到一个数组中,在写入EEPROM之前把这组数据的校验和进行缩小,缩小成一个字节可以装得下,然后把这组数据连同其校验和一起写入EEPROM,在进行复制的时候,把数据和校验和从EEPROM中读出来,读出来的校验和按照缩小的比例放大,得到真实的校验和,然后比较校验和是不是相等,相等则读出数据无误,不相等读出数据有错误
五花肉老乌龟
6楼-- · 2019-08-14 23:05
非常感谢大家的回复,可是从回复中发现大家的C还不过关。
checksum = (checksum << 1) || (checksum >> 7);
这个值要么为1要么为0.

一周热门 更多>