PHP unpack二进制数据转Python实现遇阻,求解决方案
解决方案
首先明确PHP unpack 格式与Python的对应关系:PHP的H格式是将二进制字节转为十六进制字符串,C是无符号字符,n是大端无符号短整数,c是有符号字符。结合Python的bytes操作和struct模块可完全复现PHP的解包结果:
步骤1:转二进制数据
import struct # 原始十六进制字符串 hex_str = "57002991f605009ac6342101000000be1430038800003b0031033e3100f42303a905430000e6" data = bytes.fromhex(hex_str)
步骤2:分字段解包并映射结果
# 解析十六进制字符串类型字段 cmd = data[0:2].hex() mac = data[2:10].hex() ukn = data[10:20].hex() crc = data[-1:].hex() # 解析数值类型字段,使用struct大端格式(>) state, dc_current, dc_power, efficiency, ac_freq, ac_volt, temp, wh, kwh, unused = struct.unpack( ">BHHHbHbhHH", data[20:37] ) # 组装成和PHP结构一致的字典 result = { "cmd": cmd, "mac": mac, "ukn": ukn, "State": state, "DCCurrent": dc_current, "DCPower": dc_power, "Efficiency": efficiency, "ACFreq": ac_freq, "ACvolt": ac_volt, "Temp": temp, "Wh": wh, "kWh": kwh, 1: unused, "CRC": crc } print(result)
输出结果
运行后将得到与PHP完全一致的结果:
{ 'cmd': '5700', 'mac': '2991f605009ac634', 'ukn': '2101000000be14300388', 'State': 0, 'DCCurrent': 59, 'DCPower': 49, 'Efficiency': 830, 'ACFreq': 49, 'ACvolt': 244, 'Temp': 35, 'Wh': 937, 'kWh': 1347, 1: 0, 'CRC': 'e6' }
关键说明
- PHP的
Hn格式对应Python中取对应长度的bytes,调用.hex()方法转为十六进制字符串 - PHP的
C对应struct的B(无符号字符),c对应b(有符号字符) - PHP的
n是大端序无符号短整数,对应struct的H,格式前缀>表示大端序 - 单独的
n字段对应结果中的数字键1,直接映射为unused变量后放入字典即可
内容的提问来源于stack exchange,提问作者bulldog5046
相关产品推荐
相关产品推荐

