打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

仰天大笑出门去,我辈岂是蓬蒿人。

/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

/8 小结/

1、本文主要介绍了Python里边字节流处理神器struct。
2、struct是用来解决bytes和其他二进制数据类型的转换的模块,它使得流的操作变得非常简单,完美解决了Python没有字节数据类型的尴尬。

------------------- End -------------------

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
CSDN官方发布的《180道Python面试题,助你一举通过面试》浅析一
Python中struct.pack()和struct.unpack()用法详细说明
Python使用struct处理二进制
python3通过文件头判断文件类型
Python 字符串前面加u,r,b的含义
使用 struct 模块打包/解包二进制数据
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服