Python 英特尔十六进制8位行校验和计算器

Python 英特尔十六进制8位行校验和计算器,python,hex,checksum,Python,Hex,Checksum,我正试图想出一个Python解决方案来获取英特尔十六进制文件格式的行校验和 the_bytes = b'100000000C9425010C944D010C944D010C944D01' a = b'%02X' % (sum(the_bytes) & 0xFF) print(int(a)) 我提出了一个计算行中元素和的位,但是我不能得到校验和位(这里描述) 例如,对于一行: 100000000C9425010C944D010C944D010C944D0160 10000000C

我正试图想出一个Python解决方案来获取英特尔十六进制文件格式的行校验和

the_bytes = b'100000000C9425010C944D010C944D010C944D01'


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

print(int(a))
我提出了一个计算行中元素和的位,但是我不能得到校验和位(这里描述)

例如,对于一行:

100000000C9425010C944D010C944D010C944D0160
10000000C9425010C944D010C944D010C944D010C944D01是数据

60是行校验和


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

def twoComplement(n):
    return ((n ^ 0xFF) + 1) & 0xFF
进一步的分析表明,字节字符串的总和是根本问题,因为它与bytearray实例的总和或字节总和大不相同:
sum(b'00')
返回96


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

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

def twoComplement(n):
    return ((n ^ 0xFF) + 1) & 0xFF
进一步的分析表明,字节字符串的总和是根本问题,因为它与bytearray实例的总和或字节总和大不相同:
sum(b'00')
返回96


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

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

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)

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

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)

加上两个补码后返回202。所以它不正确,因为在这个例子中它应该是60。我知道它是60,因为这是一个文件中原始行的校验和,我用工具确认了它:添加两个补码后,它返回202。所以它不正确,因为对于示例来说它应该是60。我知道它是60,因为这是一个文件中原始行的校验和,我用工具确认了它: