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