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

点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

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

/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 -------------------

往期精彩文章推荐:

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群】

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值