You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:45:47