Perl的格式"nNcc"
相當於Python的格式"!HLbb"
。 Perl的"H*"
在Python中沒有直接的等價物。
有兩個問題。
- Python的
struct.unpack
不接受通配符,*
- Python的
struct.unpack
不「hexlify」數據串
第一個問題可以用一個輔助函數一樣unpack
圍繞工作 - 。
第二個問題可以利用binascii.hexlify
解決:
import struct
import binascii
def unpack(fmt, data):
"""
Return struct.unpack(fmt, data) with the optional single * in fmt replaced with
the appropriate number, given the length of data.
"""
# http://stackoverflow.com/a/7867892/190597
try:
return struct.unpack(fmt, data)
except struct.error:
flen = struct.calcsize(fmt.replace('*', ''))
alen = len(data)
idx = fmt.find('*')
before_char = fmt[idx-1]
n = (alen-flen)//struct.calcsize(before_char)+1
fmt = ''.join((fmt[:idx-1], str(n), before_char, fmt[idx+1:]))
return struct.unpack(fmt, data)
data = open('data').read()
x = list(unpack("!HLbbs*", data))
# x[-1].encode('hex') works in Python 2, but not in Python 3
x[-1] = binascii.hexlify(x[-1])
print(x)
當在由此Perl腳本產生的數據進行測試:
$line = pack("nNccH*", 1, 2, 10, 4, '1fba');
print "$line";
的Python腳本產生
[1, 2, 10, 4, '1fba']
我能找到除了H *之外的所有其他東西,我假設你會玩P或S。 – 2012-02-07 12:52:24
您將需要計算字符串大小,這個答案可能會有所幫助。 http://stackoverflow.com/a/5849224/70350 – pojo 2012-02-07 12:54:16
' 「而數據字節=客戶端[0] .recv(1):」'是不Python的。這是行不通的。 – 2012-02-07 13:17:19