<p>Perl格式<code>"nNcc"</code>相当于Python格式<code>"!HLbb"</code>。
Python中没有Perl的<code>"H*"</code>的直接等价物。在</p>
<p>有两个问题。在</p>
<ul>
<li>Python的<code>struct.unpack</code>不接受通配符<code>*</code></li>
<li>Python的<code>struct.unpack</code>不是“hexlify”数据字符串</li>
</ul>
<p>第一个问题可以使用类似于<code>unpack</code>的助手函数来解决。在</p>
<p>第二个问题可以用<code>binascii.hexlify</code>来解决:</p>
<pre class="lang-py prettyprint-override"><code>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)
</code></pre>
<p>在测试此Perl脚本生成的数据时:</p>
^{pr2}$
<p>Python脚本生成</p>
<pre><code>[1, 2, 10, 4, '1fba']
</code></pre>