Python 英特尔十六进制8位行校验和计算器
我正试图想出一个Python解决方案来获取英特尔十六进制文件格式的行校验和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
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,因为这是一个文件中原始行的校验和,我用工具确认了它: