Perl 形式"nNcc"
は Python 形式と同等です"!HLbb"
。Python には、Perl の に直接相当するものはありません"H*"
。
2 つの問題があります。
- Python
struct.unpack
はワイルドカード文字を受け入れません。*
- Python
struct.unpack
はデータ文字列を「hexlify」しません
最初の問題は、 のようなヘルパー関数を使用して回避できますunpack
。
2 番目の問題は、次を使用して解決できます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']