lua - Lua 中的 PEC 计算
问题描述
我正在努力计算通过 I2C 接收到的数据的数据包错误代码 (PEC),以便了解检查数据是否有效。 PEC 定义
我使用了上一个问题中所述的代码,但它对我不起作用。
数据如下所示:0x00、0x07、0x01、0x12、0x3b、0xd5
PEC 是 0xd5,它基于多项式 = x^8+ x^2+ x^1+ x^0 - 0x107
这也适用于这个计算器。
所以我的问题是,来自网站的代码和来自链接问题的代码之间的区别在哪里:
local function crc8(t)
local c = 0
for _, b in ipairs(t) do
for i = 0, 7 do
c = c >> 1 ~ ((c ~ b >> i) & 1) * 0xE0
end
end
return c
end
解决方案
此 CRC 定义在所有数据字节中使用反转位。
local function reverse(x)
-- reverse bits of a byte
local y = 0
for j = 1, 8 do
y = y * 2 + (x&1)
x = x >> 1
end
return y
end
local function crc8(t)
local c = 0
for _, b in ipairs(t) do
b = reverse(b)
for i = 0, 7 do
c = c >> 1 ~ ((c ~ b >> i) & 1) * 0xE0
end
end
c = reverse(c)
return c
end
print(tohex(crc8{0x00, 0x07, 0x01, 0x12, 0x3b})) --> 0xd5
推荐阅读
- mongodb - 在 MongoDB 中使用单个集合而不是多个集合有技术上的缺点吗?
- python - 如何在输出中添加数字
- bash - 从 ACR 中获取不以前缀开头的最新图像
- reactjs - 使用 `useState` 挂钩的 React 功能组件不会使用 ReactiveSearch 更新 onChange
- esp8266 - ESP8266 - 以编程方式设置 Wifi 凭证,然后检查它们是否有效,如果无效则更改它们(无需重置)
- multithreading - xSemaphoreGive() 被不同线程使用时卡住
- python - 简单估算器不能按列估算
- python - 无法从本地推送到 GitHub 中的多个存储库
- mysql - 读取速度最快的 MariaDB 存储引擎是什么?
- c# - LINQ 获取单个结果或 null