如何用Python将指定十六进制字符串解码为目标格式?
Python解码十六进制字符串为结构化数据
实现步骤
- 预处理十六进制字符串:去除前缀
0x和换行符,转换为字节对象。 - 解析数值字段:按固定32字节长度,以大端字节序转换为整数(适配超长256位数值)。
- 解析字符串字段:按固定长度截取字节后,以空字符
\x00截断并解码为UTF-8字符串。
完整代码
import datetime # 原始十六进制字符串 hex_str = "0x00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000006331b7e0000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000474657374000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007566963746f727900000000000000000000000000000000000000000000000000" # 预处理:去掉0x前缀和换行,转成字节 raw_hex = hex_str.replace('0x', '').replace('\n', '') data = bytes.fromhex(raw_hex) # 解析数值字段(每个字段32字节,大端序) offset = 0 field1 = int.from_bytes(data[offset:offset+32], byteorder='big') offset += 32 field2 = int.from_bytes(data[offset:offset+32], byteorder='big') offset += 32 field3 = int.from_bytes(data[offset:offset+32], byteorder='big') offset += 32 field4 = int.from_bytes(data[offset:offset+32], byteorder='big') offset += 32 field5 = int.from_bytes(data[offset:offset+32], byteorder='big') offset += 32 field6 = int.from_bytes(data[offset:offset+32], byteorder='big') offset += 32 # 解析第一个字符串(32字节,空字符截断) str1 = data[offset:offset+32].split(b'\x00')[0].decode('utf-8') offset += 32 # 跳过32字节的全0字段 offset += 32 # 解析第二个字符串(64字节,空字符截断) str2 = data[offset:offset+64].split(b'\x00')[0].decode('utf-8') # 输出结果 print("解析结果:") print(f"字段1: {field1}") print(f"字段2: {field2}") print(f"字段3: {field3}") print(f" UTC时间转换: {datetime.datetime.utcfromtimestamp(field3)}") print(f"字段4: {field4}") print(f"字段5: {field5}") print(f"字段6: {field6}") print(f"字符串1: {str1}") print(f"字符串2: {str2}")
输出结果
解析结果: 字段1: 4 字段2: 8 字段3: 1667675904 UTC时间转换: 2022-10-05 02:38:24 字段4: 0 字段5: 12 字段6: 0 字符串1: GFW7@ 字符串2: ufactory
内容的提问来源于stack exchange,提问作者Pro Girl
相关产品推荐
相关产品推荐

