2016-05-14 57 views
-1

我是Python新手(我正在使用Python3)和一般编程。您能否提供关于pack和unpack如何在python中产生答案的详细解释;我知道使用这两种函数的语法,但我不明白答案是如何计算的。举例来说,我不明白为什么下面的代码:在Python中打包和解压缩位和字节

L = struct.pack('f', 255) print([ii for ii in L])

将产生如下输出(尤其是为什么有127和67):

[0, 0, 127, 67]

还有,为什么以下代码:

LL = struct.unpack('i', b'0000') print(LL)

会产生ŧ他以下号码:

(808464432,)

感谢您的帮助。

+1

如果你是Python的新手,而且完全是编程新手,对于初学者来说,打包'struct's是一个痛苦的选择。尝试从简单的事情开始,比如一个程序,告诉你一个值范围内的每个数字是可以被3,5或者这两个数字整除(俗称“FizzBu​​zz”)。 – TigerhawkT3

回答

3

在第一种情况下,您会看到组成32bit floating point number的4个字节的十进制值。

在您的具体示例中,浮点数255.0在内存中表示为4个字节,其中十六进制值为43 7f 00 00。由于您使用的是little-endian平台,因此您首先会看到最低有效字节。因此,换算成字节的列表,你有

[ 0x00, 0x00, 0x7f, 0x43 ] 

转换为十进制值,你获得

[0, 0, 127, 67] 

在第二种情况下,你试图解释的b'0000'结果。

>>> type(b'0000') 
<class 'bytes'> 
>>> len(b'0000') 
4 

正如你可以看到,这个表达式返回的4个字节的序列,所以在这种情况下,这将是字符0的4个实例的序列。

>>> '%x' % ord('0') 
'30' 

字符0的值是十六进制0x30。解释为32位整数的4个字节相当于0x30303030的十六进制值。

>>> 0x30303030 
808464432 

当我们用十进制来写这个值时,我们获得808464432