<p><a href="http://docs.python.org/3/library/functions.html#hex" rel="nofollow">^{<cd1>}</a>函数返回一个<em>字符串</em>。在本例中,有一个由10个十六进制字符组成的字符串,表示4个字节的数字,如下所示:</p>
<pre><code>'0x55667788'
</code></pre>
<p>在python2.x中,您可以将这些不正确的数据写入二进制文件(它将显示为10个字节<code>30 78 35 35 36 36 37 37 38 38</code>,而不是您想要的四个字节<code>55 66 77 88</code>)。python3.x更聪明,只允许您将<code>bytes</code>(或<code>bytearray</code>或类似文件)写入二进制文件,而不是<code>str</code>。在</p>
<hr/>
<p>这里需要的不是十六进制字符串,而是实际的字节。在</p>
<p>您描述所需字节的方式称为<a href="http://en.wikipedia.org/wiki/Endianness" rel="nofollow">big-endian order</a>。在大多数计算机上,“本机”顺序是相反的,little endian,这将给您<code>0x88776655</code>而不是{<cd8>}。在</p>
<p>在python3.2+中,最简单的方法是<a href="http://docs.python.org/3.2/library/stdtypes.html#int.to_bytes" rel="nofollow">^{<cd9>}</a>方法:</p>
^{pr2}$
<p>(实际上,<code>signed=False</code>不是必需的,因为它是默认值,但它是一个很好的方法,可以让您明确地知道您正在处理一个无符号的32位整数。)</p>
<p>如果您坚持使用早期版本,可以使用<a href="http://docs.python.org/3/library/struct.html" rel="nofollow">^{<cd11>}</a>模块:</p>
<pre><code>filecrc = struct.pack('>I', binascii.crc32(filedata))
</code></pre>
<p><code>></code>表示大尾数,<code>I</code>表示无符号4字节整数。所以,这返回相同的结果。在这两种情况下,您得到的是<code>b'\x55\x66\x77\x88'</code>(或者,正如Python <code>repr</code>它,<code>b'\Ufw\x88'</code>)。在</p>
<hr/>
<p>这个错误有点神秘,因为没有新手会知道“缓冲区接口”是什么(尤其是因为3.x文档将其称为<a href="http://docs.python.org/3/library/io.html" rel="nofollow">Buffer Protocol</a>,而且它只作为CPython的C扩展API的一部分进行了记录……),但实际上这意味着您需要一个<a href="http://docs.python.org/3/glossary.html#term-bytes-like-object" rel="nofollow">bytes-like object</a>。通常,这个错误意味着您忘记将字符串编码为UTF-8或其他编码。但是,当您试图编写实际的二进制数据而不是编码文本时,这是相同的错误。在</p>