前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一篇文章带你剖析Python 字节流处理神器struct

一篇文章带你剖析Python 字节流处理神器struct

作者头像
Python进阶者
发布2020-07-02 14:56:08
2.9K0
发布2020-07-02 14:56:08
举报
文章被收录于专栏:Python爬虫与数据挖掘

/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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python爬虫与数据挖掘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档