[英]Python unpack() binary string
我已經用 PHP 解壓了二進制數據,現在我試圖在 python 中實現相同的結果,但未能掌握它。
$str = "57002991f605009ac6342101000000be1430038800003b0031033e3100f42303a905430000e6";
$data = hex2bin($str);
$v = unpack("H4cmd/H16mac/H20ukn/CState/nDCCurrent/nDCPower/nEfficiency/cACFreq/nACvolt/cTemp/nWh/nkWh/n/H2CRC",$data);
結果:
array(14) {
["cmd"]=>
string(4) "5700"
["mac"]=>
string(16) "2991f605009ac634"
["ukn"]=>
string(20) "2101000000be14300388"
["State"]=>
int(0)
["DCCurrent"]=>
int(59)
["DCPower"]=>
int(49)
["Efficiency"]=>
int(830)
["ACFreq"]=>
int(49)
["ACvolt"]=>
int(244)
["Temp"]=>
int(35)
["Wh"]=>
int(937)
["kWh"]=>
int(1347)
[1]=>
int(0)
["CRC"]=>
string(2) "e6"
}
我已經嘗試過 struct.unpack() 和 rawutils.unpack() 但我無法復制結果。 這是我所能得到的;
import rawutil
str = b"\x57\x00\xef\x55\xf7\x05\x00\x9a\xc6\x34\x21\x01\x00\x00\x00\xbe\x14\x30\x03\x88\x00\x00\x3b\x00\x31\x03\x3e\x31\x00\xf4\x23\x03\xa9\x05\x43\x00\x00\xe6"
v = rawutil.unpack("2X8X10XBXHB2s$",str)
結果:
['5700', 'ef55f705009ac634', '2101000000be14300388', 0, '00', 59, 49, b'\x03>', b'1\x00\xf4#\x03\xa9\x05C\x00\x00\xe6']
我似乎無法讓字符串進一步正確解包
一旦您知道PHP 的pack()
的格式如何映射到Python 的struct
的格式,只需選擇正確的格式即可。
特別是,需要以下映射:
H[N]
-> s[N/2]
(有一個小問題,需要稍后通過bytes.hex()
將其轉換為十六進制)C
-> B
n
-> H
c
-> b
以下是一些有效的 Python 代碼:
import struct
b = b"\x57\x00\xef\x55\xf7\x05\x00\x9a\xc6\x34\x21\x01\x00\x00\x00\xbe\x14\x30\x03\x88\x00\x00\x3b\x00\x31\x03\x3e\x31\x00\xf4\x23\x03\xa9\x05\x43\x00\x00\xe6"
to_hex = {0, 1, 2, 13}
x = [x.hex() if i in to_hex else x for i, x in enumerate(struct.unpack(">2s8s10sBHHHbHbHHHs", b))]
print(x)
# ['5700', 'ef55f705009ac634', '2101000000be14300388', 0, 59, 49, 830, 49, 244, 35, 937, 1347, 0, 'e6']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.