一、场景
在于客户进行协议交互时,对方给出了协议和一串hex dump字符串, 通过python脚本解析接口的各个字段
二、struct库的介绍
官方的文档
https://docs.python.org/zh-cn/3/library/struct.html
2.1了解大序端和小序端
原生字节顺序可能为大端序或小端序,具体取决于主机系统。
例如,Intel x86, AMD64 (x86-64) 和 Apple M1 是小端序的;IBM z 和许多旧式架构则是大端序的。
请使用 sys.byteorder
来检查你的系统字节顺序。
2.2格式字符
三、脚本编写
import struct import chardet hex_string = "AA 44 12 1C B9 05 00 A0 7E 00 00 00 71 A0 D7 08 90 28 12 17 00 00 00 00 E2 54 16 37 01 00 00 00 35 00 00 00 88 33 13 99 DA 28 3F 40 72 0B 6A 50 6B 4B 5E 40 00 00 70 FD 1B 69 39 40 56 9F 2A 41 CF 06 CE FC CD 22 5B BF BC 59 D9 24 26 C0 41 3F 99 39 74 49 F3 FC 70 3F 75 B4 32 2C 45 C6 E2 BF C8 A9 48 E8 93 10 0D 40 CB AC A2 59 E1 25 63 40 AB ED 25 3E 61 56 22 3E 9D 7D 22 3E 1D 15 1F 3C 87 28 1F 3C 58 E2 35 3B 19 52 2F 3E 3E 7A E0 3D 4A DA AA 40 01 00 00 00 00 00 8E 8C 49 9E 0A" # 去除空格并转换为二进制 binary_data = bytes.fromhex(hex_string.replace(' ', '')) # 输出二进制数据(以字节形式) result = chardet.detect(binary_data)
print(binary_data, len(binary_data))print("Sync:", struct.unpack('<c', binary_data[0:1])[0]) print("Sync:", struct.unpack('<c', binary_data[1:2])[0]) print("Sync:", struct.unpack('<c', binary_data[2:3])[0]) print("Header Length:", struct.unpack('<B', binary_data[3:4])[0])
这样我们就可以解析出来协议对应每个字段的值
参考链接:
https://docs.python.org/zh-cn/3/library/struct.html