视频教程下载链接:http://pan.baidu.com/s/1hrTPy1u
配套教程下载:http://pan.baidu.com/s/1qYdI6q4
这节课,我们来讨论struct模块中的pack和unpack函数。首先,大家需要知道的是:struct可以将任意类型数据,比如说数字,字符串转换为字节数据,那么, struct的这种转换有什么用处呢?以后,我们将会讲解Python网络编程相关的知识,当我们进行网络编程的时候,这时候我们用于网络传输的是字节数据,所以这就是struct模块的用武之地!为了使用struct,首先需要包含struct模块:
from struct import * |
这里,大家可能第一次接触到from import这个句式,所以这里贴出它们的区别
#import Module # 引入模块 #from Module import Other # 引入模块中的类、函数或者变量#from Module import * # 引入模块中的所有‘公开’成员 |
然后呢,我们就来将普通数据转换成字节数据,这样就可以方便在网络上传输了。如何将数据转换成字节数据呢?首先,我们创建一个变量Packed_data,然后我们再调用一个pack函数,你可以看到,使用它需要2个参数:
图 6‑1
第一个是fmt,format,也就是数据的格式,第二个参数就是数据的列表了,所以,如果你查看Python函数文档的话,它会告诉你数据格式的形式,比如说我们的数据格式是2个int型,一个float型,那么这里的第一个参数就是:“iif”,如果是5个int型,那么格式就是:“iiiii”,非常简单,这里我们用iif,然后后面我们就可以直接输入对应的数据了,接着我们将字节的数据打印出来:
packed_data = pack("iif",6, 19, 4.73) print(packed_data) |
运行:
图 6‑2
你看,首个字母’b’代表的是bytes的意思,然后后面就跟着一系列16进制数据,x代表16进制,所以转换成字节数据后,就方便网络的传输了。
那么接下来,如何将这些字节数据转换回来呢?首先,我们可以计算需要转换的字节的总个数,这里就需要用到内置函数:calcsize,它会计算出需要存储的字节数据的大小:
print(calcsize('i')) print(calcsize('f'))print(calcsize('iif')) |
运行:
图 6‑3
我们来分析这个结果,从结果中我们知道int类型占4个字节,float类型也占4个字节,所以iif就占12个字节。没问题。
所以,有了字节数据和它的大小,我们就能够将它转换回去,有pack就有unpack,所以,这里定义一个original_data变量来存储转换回来的数据,然后调用unpack函数:
图 6‑4
它同样需要文件的格式,和二进制的数据:
然后我们把这个数据打印出来:
original_data = unpack('iif', packed_data) print(original_data) |
运行: 图 6‑5 就输出了原来的数据,这里4.73后面是因为计算机的计算的误差,没有办法避免。所以,如果你编写的程序,需要使用到字节数据和数字,字符串等数据的转换,这时候,就需要使用到struct模块中的pack和unpack函数了。 更多精彩内容尽在视频中!