无Lua使用经验,求实现指定规则命令帧校验和计算的Lua方法
Lua 实现指定命令帧校验和计算方法
前置规则确认
先明确你给出的计算规则:
命令帧序列:
55 aa 00 00 fe 00 00 00 00 00 01 00 00 01 51 13 01 00 XX
其中XX取值范围为0x00 ~ 0x0F(对应十进制1~16)
校验和计算公式:
总SUM = 固定段字节求和 + XX + 0x5555
校验和由高8位SUM_H、低8位SUM_L组成,满足SUM = SUM_H << 8 + SUM_L
其中固定段字节预计算总和为0x164(十进制356),无需每次遍历计算。
代码实现
原生位运算版本(Lua 5.2+ 支持)
-- 输入参数:xx 待填入帧的XX值,取值范围 0x00~0x0F -- 返回值:sum_h 校验和高8位,sum_l 校验和低8位 function calc_frame_checksum(xx) local fixed_sum = 0x164 local total_sum = fixed_sum + xx + 0x5555 local sum_l = total_sum & 0xFF local sum_h = (total_sum >> 8) & 0xFF return sum_h, sum_l end -- 调用示例:计算XX=0x03时的校验和 local sum_h, sum_l = calc_frame_checksum(0x03) -- 打印十六进制格式结果 print(string.format("校验和高8位:0x%02X,低8位:0x%02X", sum_h, sum_l))
兼容老版本Lua(5.1及以下)
如果你的Lua环境没有原生位运算支持,用取模和除法实现即可:
function calc_frame_checksum_old(xx) local fixed_sum = 0x164 local total_sum = fixed_sum + xx + 0x5555 local sum_l = total_sum % 256 local sum_h = math.floor(total_sum / 256) % 256 return sum_h, sum_l end
注意事项
- 调用函数前请确认
XX值在0x00~0x0F范围内,超出范围计算出的校验和不符合规则 - 要将校验和拼接回原命令帧时,按
SUM_L在前、SUM_H在后的顺序追加到帧末尾即可
内容的提问来源于stack exchange,提问作者blunde
相关产品推荐
相关产品推荐

