Python模块struct(二进制数据服务)
2024-09-04 22:20:14
struct模块
Python没有专门处理字节的数据类型。但由于b'str'
可以表示字节,所以,字节数组=二进制str。
而在C语言中,我们可以很方便地用struct、union来处理字节,以及字节和int,float的转换。
在Python中,比方说要把一个32位无符号整数变成字节,也就是4个长度的bytes
,你得配合位运算符这么写:
>>> n = 10240099
>>> b1 = (n & 0xff000000) >> 24
>>> b2 = (n & 0xff0000) >> 16
>>> b3 = (n & 0xff00) >> 8
>>> b4 = n & 0xff
>>> bs = bytes([b1, b2, b3, b4])
>>> bs
b'\x00\x9c@c'
解释:
10240099是十进制数字,转化为2进制数字有24位(3个字节)。想把它用字节串表示,可以使用bytes()方法,但是bytes()指接收1个字节以内的十进制数字,即0~255。所以要把10240099分解为3部分,每部分一个字节,然后用bytes()求每个字节的字节串,最后再组装起来。很麻烦,具体见上面的代码。
说明:
b2 = (n & 0xff0000) >> 16 #位运算符号&,和右移运算符>>的作用:提取10240099的右边的8位字符。
10240099 & 0xff0000 ,位与,只有都是有1,才得1
1001 1100 0100 0000 0110 0011
1111 1111 0000 0000 0000 0000
----------------------------------------&
1001 1100 0000 0000 0000 0000
然后对得到的数右移>>16, 得到10011100。这就相当于从10240099中提取了从左边开始的8bit数字。
struct
解决bytes
和其他二进制数据类型的转换。
>>> import struct
>>> struct.pack('>I', 10240099)
b'\x00\x9c@c'
函数:
struct.
pack
(format, v1, v2, ...)
参数:
- format,格式的字符串表示。 '>'代表big-endian, 'I'代表4字节无符号整数。'H'代表2字节无符号整数。
struct.
unpack
(format, buffer)
unpack
把bytes
变成相应的数据类型:
>>> struct.unpack('>IH', b'\xf0\xf0\xf0\xf0\x80\x80')
(4042322160, 32896)
本文参考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017685387246080
最新文章
- 浅谈C++设计模式之抽象工厂(Abstract Factory)
- 20160808_Linux服务
- 319. Bulb Switche
- JMeter使用指南--转
- jQuery实现的简单分页功能的详细解析
- iOS 多线程NSThread理解与场景示例
- sklearn.neighbors.kneighbors_graph的简单属性介绍
- 检测 web项目 404 500 状态的 页面
- Mtlab:抛物型方程的交替方向隐格式(ADI)
- c语言判断闰年作业
- ln语法
- DAO层基础设计原理
- fastadmin系统配置
- Delphi使用iTools安卓模拟器
- 面向对象【day07】:面向对象引子(一)
- mysql用户权限分配专栏
- [BZOJ4541][HNOI2016]矿区(平面图转对偶图)
- 基于Hadoop2.6.5(HA)的HBase2.0.5配置
- Zookeeper session超时
- 【Ubuntu】全局代理
热门文章
- LeetCode刷题4——子集
- flex 遇上white-space:nowrap的2种解决方法
- Mac下使用sshpass让iterm2支持多ssh登录信息保存
- js-转换方式示例
- OpenCV 2.4.8 or OpenCV 2.4.9组件结构全解析
- Linux正则表达式题型
- [目标检测] 从 R-CNN 到 Faster R-CNN
- 基于hanlp的es分词插件
- getBoundingClientRect()方法
- row_number()、rank()、dense_rank()排序方式的区别