- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试实现一个函数来计算可变长度内存区域的 8 位 Fletcher 校验和,我的想法是我可以传递一个 2 字节短数组或 2kb 数组并使用相同的函数。我今天才研究它,所以我绝对不是校验和算法或指针算法方面的专家,而且我的代码几乎肯定充满错误。
基本上我的策略是传递一个指向组中第一个字节地址的指针,以及要扫描的内存区域的大小,只要大小总是sizeof(object being passed),这将是有效的。我可以在函数内计算 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;
i
和 size
应该是同一类型。我更喜欢 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++ - 任意长度字节组的 Fletcher 校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34147580/
我想要以下内容: void foo( /* something representing a function f */, /* arguments a1, a2, etc. in s
简而言之,我想声明一个这样的特征: trait Test { def test(amount: Int): A[Int] // where A must be a Monad } 这样我就可以
在 GWT 中,如何在 onModuleLoad 方法中插入框架集以及相对嵌套的框架集和框架,以合并许多小程序和其他小部件和 HTML?代码片段是: 公共(public)类 MainEntryPoin
这个问题在这里已经有了答案: How do I best simulate an arbitrary univariate random variate using its probability
我对java相当陌生,并且习惯于枚举本质上只不过是一个命名的整数列表。 现在我正在编写一个实现,其中父类有几个采用枚举值作为参数的方法。枚举将在子类中定义,并且会略有不同。由于枚举基本上看起来像类,所
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
想象一下 6-7 台服务器的设置都完全相同Java 版本“1.6.0_18”OpenJDK 运行时环境 (IcedTea6 1.8) (fedora-36.b18.fc11-i386)OpenJDK
这个问题在这里已经有了答案: What are some uses of template template parameters? (10 个答案) 关闭 4 年前。 我有一个根据策略舍入值的函数
我正在寻找如何在 Java 中给定一个 Async CompletableFutures 列表,以便前 N 个中的任何一个成功完成或失败。除非没有 N 次成功,否则忽略任何失败。 有这方面的例子吗?
我面临的问题是项目已经使用集群编程来分配任务。 if (cluster.isMaster) { // Fork workers. for (var i = 0; i { }); } el
我正在为 Luxology modo(3D 和 VFX 应用程序)编写脚本,该脚本使用 python 作为脚本语言。在我的脚本中的某个位置,我正在读取从其他应用程序输出的文本文件,并从该文本文件的行创
这个问题在这里已经有了答案: Fast arbitrary distribution random sampling (inverse transform sampling) (5 个答案) 关闭
我只是遇到了一个问题,我有一个结构数组,例如 package main import "log" type Planet struct { Name string `json:"
我正在尝试将 class ResponseResult 编码为 json case class ResponseResult (var Code : Int, var
我想将一个矩阵中的一个 block 复制到另一个矩阵的一部分中。要将其与任何类型的 n 维数组一起使用,我需要通过 [] 运算符应用带有偏移量的列表。有办法做到这一点吗? mat_bigger[0:5
我有一个匹配一组数字和字母的正则表达式。但是我希望能够排除任何三个连续的字母。这是为了防止意外形成单词或缩写。 我的表达如下。它还排除了一些类似的字符,如 0、o、O 和 1、i、I、l): ^[2-
根据documentation . 应匹配任何字符,但不匹配重音字符。 mysql> select 'test' regexp 't.st'; +----------------------+ | '
我该如何用 JavaScript 编写这个 if 语句? if(url == "http://www.google.com/" && "*") { ... } * 需要灵活并接受添加到第一个变量上
我知道 cPython 有一个 GIL,因此如果不使用多处理模块,您的脚本就无法在多个内核上运行。但是有什么可以阻止内置功能,例如使用多核进行排序吗?我不了解 cPython 结构,但我想我要问的问题
寻找命令行 gdb 的替代方法来检查 OSX 上的核心转储 - 有没有办法让 Xcode 打开带有调试符号的任意核心转储? 最佳答案 您是否尝试过使用 MachOView 1? 听起来它可能适用于查看
我是一名优秀的程序员,十分优秀!