Lua 中的 PEC 计算
PEC calculation in Lua
我正在努力计算通过 I2C 接收的数据的数据包错误代码 (PEC),以便了解检查数据是否有效。
PEC Definition
我使用了 中所述的代码,但它对我不起作用。
数据如下所示:0x00、0x07、0x01、0x12、0x3b、0xd5
PEC 是 0xd5,它基于多项式 = x^8+ x^2+ x^1+ x^0 - 0x107
这也适用于 this calculator。
所以我的问题是,网站代码与链接问题代码之间的区别在哪里:
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
我正在努力计算通过 I2C 接收的数据的数据包错误代码 (PEC),以便了解检查数据是否有效。 PEC Definition
我使用了
数据如下所示:0x00、0x07、0x01、0x12、0x3b、0xd5
PEC 是 0xd5,它基于多项式 = x^8+ x^2+ x^1+ x^0 - 0x107
这也适用于 this calculator。
所以我的问题是,网站代码与链接问题代码之间的区别在哪里:
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