- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我很难弄清楚 Fletcher checksum algorithm 的 32 位变体的哪个实现。是正确的。维基百科提供了以下优化实现:
uint32_t fletcher32( uint16_t const *data, size_t words ) {
uint32_t sum1 = 0xffff, sum2 = 0xffff;
size_t tlen;
while (words) {
tlen = words >= 359 ? 359 : words;
words -= tlen;
do {
sum2 += sum1 += *data++;
} while (--tlen);
sum1 = (sum1 & 0xffff) + (sum1 >> 16);
sum2 = (sum2 & 0xffff) + (sum2 >> 16);
}
/* Second reduction step to reduce sums to 16 bits */
sum1 = (sum1 & 0xffff) + (sum1 >> 16);
sum2 = (sum2 & 0xffff) + (sum2 >> 16);
return sum2 << 16 | sum1;
}
此外,我改编了维基百科文章中的非优化 16 位示例来计算 32 位校验和:
uint32_t naive_fletcher32(uint16_t *data, int words) {
uint32_t sum1 = 0;
uint32_t sum2 = 0;
int index;
for( index = 0; index < words; ++index ) {
sum1 = (sum1 + data[index]) % 0xffff;
sum2 = (sum2 + sum1) % 0xffff;
}
return (sum2 << 16) | sum1;
}
这两种实现都产生相同的结果,例如0x56502d2a
用于字符串 abcdef
。为了验证这确实是正确的,我试图找到该算法的其他实现:
所有这些似乎都同意 abcdef
的校验和是 0x8180255
而不是维基百科上的实现给出的值。我已将其缩小到实现操作的数据缓冲区的方式。上述所有非维基百科实现一次操作一个字节,而维基百科实现使用 16 位字计算校验和。如果我修改上面的“天真”维基百科实现来改为按字节操作,它的内容如下:
uint32_t naive_fletcher32_per_byte(uint8_t *data, int words) {
uint32_t sum1 = 0;
uint32_t sum2 = 0;
int index;
for( index = 0; index < words; ++index ) {
sum1 = (sum1 + data[index]) % 0xffff;
sum2 = (sum2 + sum1) % 0xffff;
}
return (sum2 << 16) | sum1;
}
唯一改变的是签名,真的。所以这个修改后的朴素实现和上面提到的实现(维基百科除外)一致认为 abcdef
的校验和确实是 0x8180255
。
我现在的问题是:哪个是正确的?
最佳答案
根据standard ,正确的方法是维基百科提供的方法——除了名称:
Note that the 8-bit Fletcher algorithm gives a 16-bit checksum and the 16-bit algorithm gives a 32-bit checksum.
关于Fletcher32校验和算法的正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40270450/
在 wikipedia Fletcher's checksum 上使用直接实现对于“BCA”和“CAB”以及“BAC”和“ACB”等数据,我们得到相同的校验和。 这是预期的吗? Fletcher16
Wikipedia article for Fletcher's checksum状态: These examples assume two's complement arithmetic, as F
在 discoboard (ARM7) 上,我试图从 https://en.wikipedia.org/wiki/Fletcher%27s_checksum 中实现弗莱彻算法,输入是一个 32 位字。
我正在尝试实现一个函数来计算可变长度内存区域的 8 位 Fletcher 校验和,我的想法是我可以传递一个 2 字节短数组或 2kb 数组并使用相同的函数。我今天才研究它,所以我绝对不是校验和算法或指
我正在尝试实现 8 位 fletcher 算法。我写了一段代码来做到这一点,但我不确定我是否正确理解了算法。这是我的一段代码: public class TestFletcher { public s
这个转换是从原来的吗? uint8_t fletcher8( uint8_t *data, uint8_t len ) { uint8_t sum1 = 0xff, sum2 = 0xff;
我是一名优秀的程序员,十分优秀!