【发布时间】:2015-12-08 02:46:26
【问题描述】:
我一直在尝试根据文件头生成校验和,但收到的结果相互矛盾。在从设备手册中,它说明了以下内容来生成校验和:
"头部校验和采用简单的八位计算,所需步骤如下:
- 计算单个字节中标头字节的总和。或者计算 总和,然后与 FFhex 的结果。
- 校验和 = 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 库以及如何正确使用它时。我应该停止让事情变得更糟。您的观点已被记录下来,以备将来编码!