我正在使用 Python 开发家庭自动化系统(ElkM1)的接口。我在下面的 C# 中有示例代码,显然正确地计算了向该系统发送消息时所需的校验和。我将下面的 python 代码放在一起,但它似乎没有返回正确的值。
根据文档,消息的校验和需要是 mod256 中消息的 ASCII 值的总和,然后作为 2s 补码。从他们的手册中:“这是消息中所有字符的 ASCII 值的模 256 和的十六进制二进制补码,不包括校验和本身和消息末尾的 CR-LF 终止符。允许的字符是 ASCII 0-9和大写AF。当所有字符都添加到校验和时,该值应该等于0。
供应商有一个工具可以计算正确的校验和。作为测试数据,我一直在使用“00300005000”,它应该返回一个 74 的校验和
我的代码返回 18
提前致谢。
我的代码(Python)
def calc_checksum (string):
'''
Calculates checksum for sending commands to the ELKM1.
Sums the ASCII character values mod256 and takes
the Twos complement
'''
sum= 0
for i in range(len(string)) :
sum = sum + ord(string[i])
temp = sum % 256 #mod256
rem = temp ^ 256 #inverse
cc1 = hex(rem)
cc = cc1.upper()
p=len(cc)
return cc[p-2:p]
他们的代码 C#:
private string checksum(string s)
{
int sum = 0;
foreach (char c in s)
sum += (int)c;
sum = -(sum % 256);
return ((byte)sum).ToString("X2");
}