- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个转换是从原来的吗?
uint8_t fletcher8( uint8_t *data, uint8_t len )
{
uint8_t sum1 = 0xff, sum2 = 0xff;
while (len) {
unsigned tlen = len > 360 ? 360 : len;
len -= tlen;
do {
sum1 += *data++;
sum2 += sum1;
tlen -= sizeof( uint8_t );
} while (tlen);
sum1 = (sum1 & 0xff) + (sum1 >> 4);
sum2 = (sum2 & 0xff) + (sum2 >> 4);
}
/* Second reduction step to reduce sums to 4 bits */
sum1 = (sum1 & 0xff) + (sum1 >> 4);
sum2 = (sum2 & 0xff) + (sum2 >> 4);
return sum2 << 4 | sum1;
}
uint32_t fletcher32( uint16_t *data, size_t len )
{
uint32_t sum1 = 0xffff, sum2 = 0xffff;
while (len) {
unsigned tlen = len > 360 ? 360 : len;
len -= tlen;
do {
sum1 += *data++;
sum2 += sum1;
tlen -= sizeof( uint16_t );
} 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;
}
最佳答案
如何计算 tlen
值(value)
Actually I don't know what to do with the line: unsigned tlen = len > 360 ? 360 : len;
n(n+5)/2 × (216−1) < 232
uint32_t
。 .对于 4 位数据字和 8 位累加器,对应的值为 4,计算公式为
n(n+5)/2 × (24−1) < 28
uint32_t
对于
sum1
和
sum2
,那么你可以在溢出危险之前对 23927 个半字节求和,但在那之后,你需要对
sum1 = (sum1 & 0xf) + (sum1 >> 4)
形式进行多达 7 次归约。将其归结为
1
范围通过
0x1e
,您的原始算法执行此操作的方式。将其写为
(sum1 - 1)%0xf + 1
可能更有效.在这种情况下,您甚至可以将范围从 1 到 15 更改回 0 到 14,将总和初始化为 0 并将减少写为
sum1 %= 0xf
.除非您需要与使用其他范围的实现兼容。
关于c - 将 Fletcher 校验和从 32 位重制为 8 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8925018/
在 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;
我是一名优秀的程序员,十分优秀!