任意长度字节组的弗莱彻校验和
Fletcher's Checksum for arbitrary length group of bytes
我正在尝试实现一个函数,为可变长度的内存区域计算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++实现,但上面的代码也可以是psudocode。我最想知道的是我的方法是否正确。
您的第一个版本比第二个版本更好。
第二个版本中的一些错误:
-
data
的类型不应为void *
,否则*(data + i)
是编译时错误。data = (uint8_t *)data;
什么也不做。 -
sum1 << 4;
错过了一个=
来做任何事情:sum1 <<= 4;
-
CCD_ 8和CCD_。我更喜欢
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);
}
相关文章:
- 如何用尽可能少的数据将数据缓冲区计算为零校验和值
- 计算校验和的逐位运算符
- 如何从存储在 QByteArray 中的十六进制值计算校验和
- 如何在 c++ 中计算对象的哈希/校验和/指纹?
- C++文件传输的校验和算法
- 如何从 IP 校验和字段中计算十六进制值
- 计算句子的校验和(XOR)(由不同变量/类型的组合形成)
- 目录校验和
- 编译后如何计算某些二进制功能(或基本块)的校验和
- PMS5003带有ESP8266-许多校验和错误
- 未正确的校验和释放对象 - 打印时错误
- 将C++校验和函数转换为 Java
- 确定是否使用boost.asio计算UDP校验和
- 校验和CRC 16从C 到Java
- 不同的CRC32校验和同一文件
- Qt,tcp/ip通信校验和
- 正在计算ICMP数据包校验和
- 错误的校验和错误遍布程序
- 如何计算 dmg 文件上的主校验和和数据分叉校验和
- 任意长度字节组的弗莱彻校验和