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

本文详细介绍了Python的struct模块,用于处理字节流和二进制数据类型的转换。struct提供了打包和解包功能,支持不同字节顺序和对齐方式,常用于网络传输和文件处理。示例展示了如何使用struct进行封包和解包操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

推荐三个网站

1.Python进阶知识: http://python.iswbm.com 

2.Python魔法技巧: http://magic.iswbm.com 

3.PyCharm 手册: http://pycharm.iswbm.com

/1 前言/

    struct是用来解决bytes和其他二进制数据类型的转换的模块,它使得流的操作变得非常简单,完美解决了Python没有字节数据类型的尴尬。

/2 用处/

1、按照指定格式将Python数据转换为字符串,该字符串为字节流,如网络传输时,不能传输int,此时先将int转化为字节流,然后再发送;

2、按照指定格式将字节流转换为Python指定的数据类型;

3、处理二进制数据,如果用struct来处理文件的话,需要用’wb’,’rb’以二进制(字节流)写,读的方式来处理文件。

/3 struct模块中的函数/

如下表所示:

75b9d121b698035c47006ef4aa7b5f81.png

/4 格式化字符串/

    当打包或者解包的时,需要按照特定的方式来打包或者解包。该方式就是格式化字符串,它指定了数据类型,除此之外,还有用于控制字节顺序、大小和对齐方式的特殊字符。

/5 对齐方式/

    为了同c中的结构体交换数据,还要考虑c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换。可以用格式中的第一个字符来改变对齐方式。定义如下:

e80dc0aa70901076ac178cb374c95367.png

端: 数据在存储器中存放顺序的顺序。

分度值,byte,即byte都是按照正常顺序,但是byte组装成的int时byte的顺序则不同。

大端:较低的有效字节存放在较高的存储器地址中,较高的有效字节存放在较低的存储器地址 。

小端:较高的有效字节存放在较高的存储器地址中,较低的有效字节存放在较低的存储器地址。

/6 格式符/

如下表所示:

f8e356bfa2b2ad3a8dc5aa3eeed2ffea.png

说明:

1、_Bool在C99中定义,如果没有这个类型,则将这个类型视为char,一个字节;

2、q和Q只适用于64位机器;

3、每个格式前可以有一个数字,表示这个类型的个数,如s格式表示一定长度的字符串,4s表示长度为4的字符串;4i表示四个int;

4、P用来转换一个指针,其长度和计算机相关;

5、f和d的长度和计算机相关;

/7 示例/

一般来说,我们的封包解包可以简写成这样,pack函数把任意数据类型变成bytes

ac9796fa48cf6eb3bd16b3d00f82cd41.png

unpack把bytes变成相应的数据类型,我们在解包的时候很容易出现这种问题,如下图:

90b9dc176635c10355d2df0ae6a08f9a.png

那么这是怎么回事了,原来,这是因为传给unpack函数的buffer参数本应是4个字节,结果传多了,导致溢出,所以,针对这种情况,我们只需加一个判断,如果长度不是4,就跳过。

d9312ae330d04473b48668848fd37c07.png

若是要解包图片类型,则可以先读取文件然后在解包,如图:

c22492beb20eb3c0d878ccc4bd8bfdd6.png

可以看出,他打印除了第一个解包的字节。

pack_into 是将不同类型的数据对象放在一个组里,然后将他转换为字节流对象,而且他可以事先定义封包的范围。

unpack_from 是将字节流对象转换为不同的数据对象,也可以定义,这里不在累述。

calcsize 计算格式所占的内存大小,比如说:

9aba3367a4e062a32e690d564d3fa594.png

好了,struct主要的内容就这么多,深入会比较复杂,在此附上一张应用实例截图,希望大家多多交流:

877bbdcf3581d7ed6a809b7e22523347.png

本文参考链接:

https://blog.csdn.net/qq_30638831/article/details/80421019

/8 小结/

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

推荐阅读

《Python黑魔法指南》全新版本 v2.0 上线发布

一篇文章掌握 Python 内置 zip() 的全部内容

一个没法商用,但是好玩有趣的 Python 手绘图形库!

Docker 被禁,有哪些开源产品可以替代

每个Python程序员都应该知道的10个缩写

带你用 Python 实现自动化群控(入门篇)

这个 Python 炫技操作千万不要用,别问我怎么知道的?

长按下图  ➡   关注博主

(按左边关注 Python, 按右边关注 Goalng)

d95cdff222fdc760b2658fca64aca1fc.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值