gpt4 book ai didi

python - 需要计算校验和方面的帮助

转载 作者:行者123 更新时间:2023-11-30 23:36:01 25 4
gpt4 key购买 nike

我正在使用 Python 开发家庭自动化系统 (ElkM1) 的接口(interface)。我有下面的 C# 示例代码,它显然可以正确计算向该系统发送消息时所需的校验和。我将下面的 python 代码放在一起,但它似乎没有返回正确的值。

根据文档,消息的校验和需要是消息的 ASCII 值的 mod256 之和,然后取 2 的补码。从他们的手册中可以看出:“这是消息中所有字符的 ASCII 值模 256 之和的十六进制补码,不包括校验和本身以及消息末尾的 CR-LF 终止符。允许的字符是 ASCII 0-9和大写A-F。当所有字符都添加到校验和时,该值应等于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");
}

最佳答案

FWIW,这是 C# 代码到 Python 的直译:

def calc_checksum(s):
sum = 0
for c in s:
sum += ord(c)
sum = -(sum % 256)
return '%2X' % (sum & 0xFF)

print calc_checksum('00300005000')

显示的消息输出为 E8,这与您的代码和 C# 代码都不同。根据手册中的描述并手动进行计算,我不明白他们的答案怎么可能是74。你怎么知道这是正确答案?

在看到 Mark Ransom 的评论(C# 代码确实返回 E8)后,我花了一些时间调试您的 Python 代码,并找出了为什么它不会产生相同的结果。一个问题是它无法在代码中带有注释 #inverse 的行正确计算二进制补码。至少有几种方法可以正确地做到这一点。

第二个问题是 hex() 函数处理负数的方式不是您所期望的。在这种情况下,使用 -24 二进制补码会生成 -0x18,而不是 0xffe8 或类似的内容。这意味着仅采用大写结果的最后两个字符是不正确的。一种非常简单的方法是使用 % 字符串插值运算符将值的低字节转换为大写十六进制。这是您的函数的工作版本:

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 ^ 0xFF) + 1 # two's complement, hard way (one's complement + 1)
rem = -temp # two's complement, easier way
return '%2X' % (rem & 0xFF)

一种更 Pythonic(且更快)的实现是像这样的单行代码,它使用内置的 sum() 函数:

def calc_checksum(s):
"""
Calculates checksum for sending commands to the ELKM1.
Sums the ASCII character values mod256 and returns
the lower byte of the two's complement of that value.
"""
return '%2X' % (-(sum(ord(c) for c in s) % 256) & 0xFF)

关于python - 需要计算校验和方面的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16822967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com