/1 前言/
struct是用来解决bytes和其他二进制数据类型的转换的模块,它使得流的操作变得非常简单,完美解决了Python没有字节数据类型的尴尬。
/2 用处/
1、按照指定格式将Python数据转换为字符串,该字符串为字节流,如网络传输时,不能传输int,此时先将int转化为字节流,然后再发送;
2、按照指定格式将字节流转换为Python指定的数据类型;
3、处理二进制数据,如果用struct来处理文件的话,需要用’wb’,’rb’以二进制(字节流)写,读的方式来处理文件。
/3 struct模块中的函数/
如下表所示:
/4 格式化字符串/
当打包或者解包的时,需要按照特定的方式来打包或者解包。该方式就是格式化字符串,它指定了数据类型,除此之外,还有用于控制字节顺序、大小和对齐方式的特殊字符。
/5 对齐方式/
为了同c中的结构体交换数据,还要考虑c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换。可以用格式中的第一个字符来改变对齐方式。定义如下:
端: 数据在存储器中存放顺序的顺序。
分度值,byte,即byte都是按照正常顺序,但是byte组装成的int时byte的顺序则不同。
大端:较低的有效字节存放在较高的存储器地址中,较高的有效字节存放在较低的存储器地址 。
小端:较高的有效字节存放在较高的存储器地址中,较低的有效字节存放在较低的存储器地址。
/6 格式符/
如下表所示:
说明:
1、_Bool在C99中定义,如果没有这个类型,则将这个类型视为char,一个字节;
2、q和Q只适用于64位机器;
3、每个格式前可以有一个数字,表示这个类型的个数,如s格式表示一定长度的字符串,4s表示长度为4的字符串;4i表示四个int;
4、P用来转换一个指针,其长度和计算机相关;
5、f和d的长度和计算机相关;
/7 示例/
一般来说,我们的封包解包可以简写成这样,pack函数把任意数据类型变成bytes
:
unpack把bytes变成相应的数据类型,我们在解包的时候很容易出现这种问题,如下图:
那么这是怎么回事了,原来,这是因为传给unpack函数的buffer参数本应是4个字节,结果传多了,导致溢出,所以,针对这种情况,我们只需加一个判断,如果长度不是4,就跳过。
若是要解包图片类型,则可以先读取文件然后在解包,如图:
可以看出,他打印除了第一个解包的字节。
pack_into 是将不同类型的数据对象放在一个组里,然后将他转换为字节流对象,而且他可以事先定义封包的范围。
unpack_from 是将字节流对象转换为不同的数据对象,也可以定义,这里不在累述。
calcsize 计算格式所占的内存大小,比如说:
好了,struct主要的内容就这么多,深入会比较复杂,在此附上一张应用实例截图,希望大家多多交流:
本文参考链接: https://blog.csdn.net/qq_30638831/article/details/80421019
本文分享自 Python爬虫与数据挖掘 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!