【问题标题】:Checksum Generation from sum of bits in python从python中的位总和生成校验和
【发布时间】:2017-06-18 01:51:00
【问题描述】:

我正在尝试使用 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?

谢谢!!

【问题讨论】:

    标签: python byte checksum bits


    【解决方案1】:

    你可以找到十六进制的和

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

    (前面的0xsliced[2:] 关闭)

    那么就可以得到十六进制字符的ASCII值了

    >>> bytes = [hex(ord(c))[2:] for c in hexsum]
    >>> bytes
    ['41', '35']
    

    (同样,前面的0x从每个元素中删除)

    那你们可以一起join他们:

    >>> checksum = ''.join(bytes)
    >>> checksum
    '4135'
    

    或者一切都可以用这个单线完成:

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

    【讨论】:

    • 谢谢你,单线对我来说效果很好。
    【解决方案2】:

    Python 2

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

    def rs232_checksum(the_bytes):
        return bytes('%02X' % (sum(map(ord, the_bytes)) % 256))
    
    checksum_bytes = rs232_checksum(b'\x2e\x47\x30')
    

    Python 3

    函数定义简化为(用二进制“and”得到最低八位):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 2020-07-02
      相关资源
      最近更新 更多