如何将FLASH存储器二进制文件转为JSON?解码报错求助
解决FLASH导出二进制文件转JSON/可读文件的问题
问题根源
FLASH导出的二进制文件是原始字节数据,并非UTF-8编码的文本文件。直接用utf-8解码会报错,因为其中包含不符合UTF-8编码规则的字节(比如报错中的0xe5不是合法的UTF-8续字节)。
可行解决方案
1. 将二进制转成可读的十六进制格式
如果只是需要查看二进制的内容,可以把字节转换成十六进制字符串,方便阅读:
fileName = "TST477 DeviceMemory.bin" with open(fileName, mode='rb') as file: fileContent = file.read() # 生成带空格分隔的十六进制字符串,可读性更强 hex_content = ' '.join(f'{byte:02x}' for byte in fileContent) print(hex_content)
2. 将二进制转成可存入JSON的格式
JSON不支持直接存储二进制数据,可将二进制转成Base64编码的字符串(Base64是纯文本格式,可安全嵌入JSON):
import json import base64 fileName = "TST477 DeviceMemory.bin" with open(fileName, mode='rb') as file: fileContent = file.read() # 二进制转Base64字符串 base64_str = base64.b64encode(fileContent).decode('utf-8') # 封装成JSON json_result = json.dumps({"flash_memory_data": base64_str}, indent=4) print(json_result)
3. 解析成实际业务数据(需知道数据结构)
如果要得到有意义的可读数据,必须先明确FLASH存储的数据结构:比如每个字段的字节长度、数据类型(整数/浮点数/字符串)、字节序(大端/小端)。
举个示例(假设已知数据结构):
import struct fileName = "TST477 DeviceMemory.bin" with open(fileName, mode='rb') as file: fileContent = file.read() # 假设前4字节是大端32位整数,接下来8字节是小端64位浮点数,最后10字节是ASCII字符串 # 使用struct.unpack解析格式:>I是大端32位无符号整数,<d是小端64位浮点数,10s是10字节字符串 int_val, float_val, str_val = struct.unpack('>I<d10s', fileContent[:22]) # 清理字符串中的空字节 str_val = str_val.decode('ascii').strip('\x00') print(f"整数值: {int_val}") print(f"浮点值: {float_val}") print(f"文本内容: {str_val}")
关键提示
- 若没有数据结构文档,可联系设备厂商获取FLASH存储的协议规范,或通过设备的固件代码反向推导数据格式。
- 不要尝试用文本编码直接解码二进制数据,这几乎都会因编码不匹配报错。
内容的提问来源于stack exchange,提问作者TesterBoy
相关产品推荐
相关产品推荐

