擅长:python、mysql、java
<p>你至少要知道你的数据的宽度。例如,0xc158a854有8个十六进制数字,因此它的宽度必须至少为32位;它似乎是一个无符号的32位值。我们可以使用一些按位操作来处理它:</p>
<pre><code>In [232]: b = 0xc158a854
In [233]: if b >= 1<<31: b -= 1<<32
In [234]: b
Out[234]: -1051154348L
</code></pre>
<p>这里的L表示Python2已经切换为长时间处理该值;这通常并不重要,但在本例中,表示我一直在处理此安装的公共int范围之外的值。从二进制结构(如UDP数据包)中提取数据的工具是<a href="https://docs.python.org/2/library/struct.html" rel="nofollow">struct.unpack</a>;如果您只是告诉它您的值首先是有符号的,那么它将生成正确的值:</p>
<pre><code>In [240]: s = '\xc1\x58\xa8\x54'
In [241]: import struct
In [242]: struct.unpack('>i', s)
Out[242]: (-1051154348,)
</code></pre>
<p>这假定两个的补码表示;一个的补码(如UDP中使用的校验和)、符号和幅度或IEEE 754浮点是一些不太常见的数字编码。</p>