校验和生成从python中的位总和

时间:2017-06-18 01:51:00

标签: python byte checksum bits

我试图用python通过RS232控制冷水机组。我坚持按照以下方法生成校验和。

“校验和是两个ASCII十六进制字节,表示从sor开始的命令的所有先前字节总和的最低有效8位。”

本例中的“sor”以字节为单位为“2E”。

- 实施例
例如,PC要求将冷却器模式设置为待机。它将传输以下字节序列。 2E 47 30 4135 0D

请注意,2Eh是标题的开头(“。”),47h是命令(“G”),30h是将模式设置为待机的限定符。 41h和35h是校验和字节,表示“A5”的ASCII十六进制,这是2Eh + 47h + 30h之和的最低有效字节,0Dh是回车。

有谁知道如何生成校验和字节4135?

三江源!!

2 个答案:

答案 0 :(得分:1)

您可以在十六进制中找到总和为

>>> hexsum = hex(0x2e + 0x47 + 0x30)[2:].upper()
>>> hexsum
'A5'

(前面的0x [2:]关闭>>> bytes = [hex(ord(c))[2:] for c in hexsum] >>> bytes ['41', '35']

然后您可以将十六进制字符的ASCII值作为

0x

(同样,从每个元素中删除正面>>> checksum = ''.join(bytes) >>> checksum '4135'

然后你可以sliced他们在一起:

>>> ''.join(hex(ord(c))[2:] for c in hex(0x2e + 0x47 + 0x30)[2:].upper())
'4135'

或者所有事情都可以通过这个单线程来完成:

    <?php   
        $content = file_get_contents('somejsonfile.json');
        print_r(json_decode($content));
    ?>

答案 1 :(得分:0)

Python 2

函数rs232_checksum计算字节总和。 然后它将sum转换为大写的十六进制字符串,并返回为字节。

def rs232_checksum(the_bytes):
    return bytes('%02X' % (sum(map(ord, the_bytes)) % 256))

checksum_bytes = rs232_checksum(b'\x2e\x47\x30')

Python 3

函数定义简化为(使用二进制&#34;和&#34;以获得最低有效8位):

def rs232_checksum(the_bytes):
    return b'%02X' % (sum(the_bytes) & 0xFF)