ESP32 bin 文件 checksum

By zjsj at 19 小时前 • 0人收藏 • 21人看过

抽卡真的好难,多个AI,N多次不同方式烤问,最后还要自己总结,出来可用的python计算checksum的程序,测试通过:



import binascii

import struct

import sys


def verify_esp32_image_bin(filename):

try:

with open(filename, 'rb') as f:

data = f.read()

except FileNotFoundError:

print(f"错误: 找不到文件 {filename}")

return


total_len = len(data)

if total_len < 16:

print("错误: 文件太短")

return

print("文件长度:", len(data), "字节")


# 1. 查看 0x7F 单字节

offset = 0x7F

byte_val = data[offset]

print(f"0x7F 单字节: 0x{byte_val:02X}, 十进制: {byte_val}")


# 2. 解析 ESP32 image header

assert data[0] == 0xE9, "magic 不是 0xE9"

segment_count = data[1]

print("segment_count:", segment_count)


# ESP32 image header 大小为 24 字节

pos = 24


checksum = 0xEF  # ESP32 checksum 初值


for i in range(segment_count):

load_addr = int.from_bytes(data[pos:pos + 4], "little")

data_len = int.from_bytes(data[pos + 4:pos + 8], "little")

pos += 8


seg_data = data[pos:pos + data_len]

print(f"segment[{i}] load_addr=0x{load_addr:08X}, data_len=0x{data_len:X}")


for b in seg_data:

checksum ^= b


pos += data_len


print(f"段数据结束偏移: 0x{pos:X}")

print(f"计算得到 checksum: 0x{checksum:02X}")


# 3. checksum 位于 SHA-256 前 1 字节

# 末尾 32 字节是 SHA-256,所以 checksum 偏移为 len(data) - 33

checksum_offset = len(data) - 33

file_checksum = data[checksum_offset]


print(f"checksum 偏移: 0x{checksum_offset:X}")

print(f"文件中 checksum: 0x{file_checksum:02X}")

print(f"校验是否一致: {file_checksum == checksum}")



# 替换为您的实际文件名

verify_esp32_image_bin('bootloader.bin')


登录后方可回帖

Loading...