ESP32 bin 文件 checksum
抽卡真的好难,多个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')
登录后方可回帖