嵌入式平台下读取uint8_t二维数组为整数实现近3次重复校验的方法
方案评估与实现建议
你提出的直接读取为整数的思路不可行,原因如下:
你使用的uint8_t array[8][32]总大小为 256字节(2048位),而嵌入式平台的unsigned long最多仅为64位,远小于数组的总位宽:
- 如果你强制将数组首地址转为整数指针取值,仅能读取到数组前4/8字节的内容,剩余248/244字节的变化完全无法被感知,根本达不到判断整个数组是否重复的要求
- 目前没有任何嵌入式平台原生支持2048位的整数类型,无法直接把整个数组当作单个整数存储、比较
符合嵌入式资源受限场景的两种实现方案
方案1:低碰撞概率哈希(内存占用最低)
不需要引入任何第三方库,仅需几行代码即可实现简单哈希,最终输出32位/64位哈希值存储到arrayTemp数组,碰撞概率低到足以满足非加密级的校验需求:
// 32位简单哈希实现,计算量极小,内存仅占用4字节临时变量 uint32_t calc_array_checksum(const uint8_t arr[8][32]) { uint32_t checksum = 0x811C9DC5; // 初始偏移值,可按需修改 const uint8_t *p = (const uint8_t*)arr; for (int i = 0; i < 256; i++) { checksum ^= p[i]; checksum *= 0x01000193; // 常用FNV哈希乘法因子 } return checksum; }
使用逻辑:
- 定义存储历史哈希的数组
uint32_t arrayTemp[3] - 每次数组更新后,调用上述函数计算新的哈希值,和
arrayTemp中存储的3个历史值逐一比较即可判断是否重复 - 总内存占用仅为 3*4=12 字节,计算量对嵌入式CPU来说可忽略
方案2:零碰撞内存直接比较(可靠性最高)
如果你完全不能接受哈希碰撞的可能性,也不需要创建额外的临时比较数组,仅需存储最近2次的数组原始值(总大小2*256=512字节,绝大多数嵌入式平台都能承受),用标准库memcmp直接比较即可:
uint8_t history[2][8][32]; // 存储最近2次的数组状态 int history_idx = 0; // 每次数组更新后调用该函数判断是否和最近2次重复 bool is_duplicate(const uint8_t cur[8][32]) { // 和最近2次的历史状态比较 if (memcmp(cur, history[0], 256) == 0 || memcmp(cur, history[1], 256) == 0) { return true; } // 写入新的历史状态,覆盖最早的记录 memcpy(history[history_idx], cur, 256); history_idx = (history_idx + 1) % 2; return false; }
memcmp和memcpy都是C标准库自带的函数,所有嵌入式编译环境都支持,且内部实现经过汇编优化,比自行遍历数组比较的效率更高。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

