c++ - 任意长度字节组的弗莱彻校验和

标签 c++ c memory checksum pointer-arithmetic

我正在尝试实现一个函数来计算可变长度内存区域的 8 位 Fletcher 校验和,其想法是我可以传递 2 字节短整型或 2kb 数组并使用相同的函数。我今天才开始研究它,所以我绝对不是校验和算法或指针算术方面的专家,而且我的代码几乎肯定充满了错误。

基本上我的策略是传递一个指向组中第一个字节的地址的指针,以及要扫描的内存区域的大小,并且只要大小始终为sizeof(正在传递的对象),它将是有效的。我可以在函数内计算 sizeof 以避免潜在的错误,但我认为我必须将接受的类型限制为特定类型。

现在根据我的理解,*(ptr + i) 应该返回位于 ptr 地址后第 i 个字节的值。我以前没有做过这样的事情,所以我可能误解了我读到的内容。

uint8_t fletcher_8(void *data, uint size){
        data = (uint8_t *)data; // Recast pointer as uint8_t*
        uint8_t sum1 = 0;
        uint8_t sum2 = 0; // Initialise variables for algorithm
        for (int i =0; i < size; i++){
            sum1 += *(data + i);     // get the value of the ith byte after the data pointer's address
            sum2 += sum1;
        }
        sum1 %= 16; // modulo the first sum
        sum1 << 4;  // shift lower four bits to the upper four bits
        sum2 %= 16; // modulo the second sum
        return sum1 + sum2; // add both sums (highest four bits are sum1, lower four bits are sum2
    }

如果我完全疯了,并且有任何更简单的方法来实现我想做的事情,我很想听听!

编辑:

专门询问C++实现,但上面的代码也可能是伪代码。我最想知道我的方法是否正确。

最佳答案

您的第一个版本比第二个版本更好。

第二个版本中的一些错误:

  • data不应属于 void * 类型,否则*(data + i)是一个编译时错误。 data = (uint8_t *)data;什么都不做。

  • sum1 << 4;错过了=做任何事情:sum1 <<= 4;

  • isize应该是同一类型。我更喜欢size_t ,因为它的类型是 sizeof返回。

  • https://en.wikipedia.org/wiki/Fletcher%27s_checksum表示较高位应该是 sum2 ,你的是 sum1 中的位.

我会这样写

uint8_t fletcher_8(uint8_t *data, size_t size){
    uint8_t sum1 = 0;
    uint8_t sum2 = 0;
    for (size_t i = 0; i < size; i++){
        sum1 += data[i];
        sum2 += sum1;
    }
    return (sum1 & 0xF) | (sum2 << 4);
}

uint8_t fletcher_8(uint8_t *data, size_t size){
    uint8_t sum1 = 0;
    uint8_t sum2 = 0;
    while (size--){
        sum1 += *data++;
        sum2 += sum1;
    }
    return (sum1 & 0xF) | (sum2 << 4);
}

关于c++ - 任意长度字节组的弗莱彻校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34147580/

相关文章:

c++ - 这是引用类成员的惯用用法吗?

c++ - 在 MinGW 中使用 gcc/g++ 仪器函数?

c - Windows上C语言的定时器

c - 如何从前一个变量中获取多个 scanf 输入

c++ - 填充指向 vector 的 vector

c++ - 将 short 转换为 char 是否合法?

c++ - 如何删除结构的动态数组(C++)?

c++ - 奇怪的编译输出

read.xlsx 需要很长的时间和大量的内存

java - Java 字符串上 + 和 += 的区别