【问题标题】:Odd Checksum Result(s) - Not Receiving Expected Results奇数校验和结果 - 未收到预期结果
【发布时间】:2015-12-08 02:46:26
【问题描述】:

我一直在尝试根据文件头生成校验和,但收到的结果相互矛盾。在从设备手册中,它说明了以下内容来生成校验和:

"头部校验和采用简单的八位计算,所需步骤如下:

  1. 计算单个字节中标头字节的总和。或者计算 总和,然后与 FFhex 的结果。
  2. 校验和 = FFhex - 步骤 1 的总和。"

在这里,我在 Lua 中创建了以下代码:

function header_checksum(string)
    local sum = 0
    for i = 1, #string do
       sum = sum + string.byte(i)
    end
    local chksum = 255 - (sum & 255)
    return chksum
end

如果我发送以下(4x 字节)字符串print(header_checksum("0181B81800")),我会得到以下结果:

  • 241(如您所见发送的字符串)
  • 0(每个字节都改成十六进制再发送给函数)

在给出的示例中,它声明字节应为AD,即 173(dec) 或 \255。

有人可以告诉我我在做什么有什么问题吗?是编写的代码、我的方法,还是两者兼而有之?

【问题讨论】:

  • 使用string:byte(i) 而不是string.byte(i)
  • 这里的风格是您将参数命名为string,这也是标准模块的名称,特别是作为所有字符串的元表的模块,通常在_G.string 中找到。重载名称是完全合法的 Lua,但对于习惯于看到 string.byte() 用于直接引用函数的人类读者来说,这会造成混淆。
  • @RBerteig 好点。我太容易混淆了,尤其是涉及到 bit32 库以及如何正确使用它时。我应该停止让事情变得更糟。您的观点已被记录下来,以备将来编码!

标签: lua checksum


【解决方案1】:
function header_checksum(header)
   local sum = -1
   for i = 1, #header do
      sum = sum - header:byte(i)
   end
   return sum % 256
end

print(header_checksum(string.char(0x01,0x81,0xB8,0x18,0x00))) --> 173

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多