Hex文件类型:
Intel hexadecimal object file format, Intel hex format or Intellec Hex。
它实际上是将二进制文件转换成了ASCII码形式的文本文件,我们用文本编辑器打开hex文件,就可以看到里面的内容。本来目标文件里面的内容,应该是源代码编译后得到的机器码。然后将机器码的二进制文件转换为hex文件。
如果你需要进一步了解关于Hex文件的格式,可以查看以下博客:
Intel Hex 文件格式_夜流冰的博客-CSDN博客_intel hex文件
现在我需要得到Hex文件里所有数据的CRC32校验值
我编写了python代码如下:
import zlib
def list_to_hex_string(list_data):
list_str = '[ '
for x in list_data:
list_str += '0x{:02X},'.format(x)
list_str += ' ]'
return list_str
def main():
# 要注意 如果hex文件首行或者末行不是数据,请将非数据行删除后再填写filename
filename = "FlashDrv.hex"
f = open(filename, 'r')
file_data = f.readlines()
block = []
for content in file_data:
content = content.replace("\n", "")
block.append(content[9:-2]) # INTEL HEX 文件的格式里,每行前8个是地址,后2个是校验码,中间部分才是数据
# packageData是总的所有报文内容
packageData = "".join(block)
BlockLength = len(packageData) // 2
print('数据内容的总长度是:', BlockLength)
# 生成符合要求的dataList
dataList = []
for i in range(0, BlockLength):
dataList.append(packageData[2 * i] + packageData[2 * i + 1])
for i in range(0, BlockLength):
dataList[i] = int(dataList[i], 16)
print("dataList length is:", len(dataList), "\nall data in list is:\n", list_to_hex_string(dataList))
# Compute a CRC-32 checksum of data
print("crc32 of data is:\n%#x" % zlib.crc32(bytes(dataList)))
if __name__ == '__main__':
main()
计算输出:
数据内容的总长度是: 3011
dataList length is: 3011
all data in list is:
0x01,0x00,0x03,0x78,0xA5,0xF4,0x0F,0x00,0xDC,0xF4,0x0F,0x00,0xE1,0xF4,0x0F,0x00,0xAB,0xF5
......
41,0x00,0x11,0xFB,0x00,0x00,0xCE,0xFC,0x00,0x61,0xFA,0x51,0x1F,0xD7,0x61,0xCD,0xD7,0x79,0x5A,0x5B,0xFB, ]
crc32 of data is:
0xcd9a5601
经过拷贝数据到在线CRC计算网站进行比对,代码计算的crc32是正确的。代码无误!