Lua 计算数据包错误码(PEC)

我正在努力计算通过I2C接收到的数据的数据包错误码(PEC),以检查数据是否有效。 PEC定义

我使用了a previous question中的代码,但它对我没有用

数据看起来像这样:0x00、0x07、0x01、0x12、0x3b、0xd5

PEC基于多项式=x^8+x^2+x^1+x^0-0x107,因此为0xd5

这个计算器也可以正常使用。

所以我的问题是,从网站和链接的问题中有什么区别:

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
点赞
用户1847592
用户1847592

这个 CRC 定义在所有数据字节中都使用了反转的位。

local function reverse(x)
   -- 反转一个字节的位
   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
2021-08-10 15:23:06