【问题标题】:8-bit Line Checksum Calculator for Intel Hex用于 Intel Hex 的 8 位行校验和计算器
【发布时间】:2020-09-28 11:27:34
【问题描述】:

我正在尝试提出一个 Python 解决方案来获取 INTEL HEX FILE FORMAT 的行校验和。

the_bytes = b'100000000C9425010C944D010C944D010C944D01'


a = b'%02X' % (sum(the_bytes) & 0xFF)

print(int(a))

我想出了计算一行中元素总和的位,但我无法获得校验和位(在 http://www.keil.com/support/docs/1584/ 中描述)

例如一行:

100000000C9425010C944D010C944D010C944D0160

100000000C9425010C944D010C944D010C944D01 是数据

60 是行校验和。

http://easyonlineconverter.com/converters/checksum_converter.html

【问题讨论】:

    标签: python hex checksum


    【解决方案1】:

    您的计算似乎缺少两个补码部分,必须将其应用于计算的总和:

    def twoComplement(n):
        return ((n ^ 0xFF) + 1) & 0xFF
    

    进一步分析发现,字节串的总和是根本问题,因为它与字节数组实例的总和或字节的总和完全不同:sum(b'00') 返回 96。

    应将总和应用于相应十六进制数字字符串的binascii.unhexlify() 的结果。

    【讨论】:

    【解决方案2】:

    这是一个将十六进制值作为字符串的函数,并返回一个带有校验和的字符串。可能不是最干净的方法,但返回与您链接的转换器相同的值:

    def intel_checksum(value):
      #Remove the : from the beginning of line
      value = value.replace(":","")
      sum = 0
      #Iterate over the bytes in the hex string
      #and add each byte to sum
      for i in range(0,int(len(value)/2)):
          byte = value[i*2:(i*2)+2]
          sum += int("0x" + byte,16)
      #Find the checksum using 2s compliment
      int_checksum = ((sum ^ 0xFF) + 1) & 0xFF #https://stackoverflow.com/a/62280234/2393763
      #Return a string, formatted as 2 characters without leading "0x"
      return "{0:0{1}x}".format(int_checksum,2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      • 2015-01-04
      • 2010-11-11
      相关资源
      最近更新 更多