Python使用struct库的用法小结
作者:serfend 发布时间:2023-04-29 18:42:53
标签:Python,struct,库
struct简介
看到struct这么英文单词,大家应该并不陌生,因为c/c++中就有struct,在那里struct叫做结构体。在Python中也使用struct,这充分说明了这个struct应该和c/c++中的struct有很深的渊源。Python正是使用struct模块执行Python值和C结构体之间的转换,从而形成Python字节对象。它使用格式字符串作为底层C结构体的紧凑描述,进而根据这个格式字符串转换成Python值。
准确地讲,Python没有专门处理字节的数据类型。但由于
b'str'
可以表示字节,所以,字节数组=二进制str。而在C语言中,我们可以很方便地用struct、union来处理字节,以及字节和int,float的转换。故提供一个库来做转换。
常用函数
struct.pack(format:str, v1, v2, …)
按format的格式打包v1、v2等参数
import struct
result = [1,2,3,4,5]
print([struct.pack('<B', x) for x in result])
# [b'\x01', b'\x02', b'\x03', b'\x04', b'\x05']
struct.unpack(format:str,buffer:bytes)
按format的格式解包buffer数据,注意结果是一个数组
import struct
result = bytes.fromhex('10002030000000')
print(struct.unpack('<BHI', result))
# (16, 8192, 48)
上代码是按小端序列进行解析的
10被解析成了16
0020被解析成了 0x00 + 0x20 * 256 = 32*256 = 8192
30000000被解析成了 0x30 + 0x0 * 256 + 0x0 * 16³ + 0x0 * 256² = 48
struct.calcsize(format:str)
按format的格式计算这个格式本应该的大小
import struct
print(struct.calcsize('<BHI')) # 7
B是1个字节,H是2个字节,I是4个字节,共7个字节
format参数的用法
数据
Format | C Type | Python | 字节数 |
---|---|---|---|
x | pad byte | None | 1 |
c | char | int | 1 |
b | signed char | int | 1 |
B | unsigned char | int | 1 |
? | Bool | bool | 1 |
h | short | int | 2 |
H | unsigned short | int | 2 |
i | int | int | 4 |
I | unsigned int | int | 4 |
l | long | int | 4 |
L | unsigned long | int | 4 |
q | long long | int | 8 |
Q | unsigned long long | int | 8 |
f | float | float | 4 |
d | double | float | 8 |
s | char[] | bytes | 1 |
p | char[] | bytes | 1 |
P | void * | int | 0 |
描述符
Character | Byte order | Size | alignment |
---|---|---|---|
@ | native | native | 凑足4个字节 |
= | native | standard | 不作变化 |
< | little-endian | standard | 不作变化 |
> | big-endian | standard | 不作变化 |
! | network (= big-endian) | standard | 不作变化 |
来源:https://blog.csdn.net/m0_37157335/article/details/124656198
0
投稿
猜你喜欢
- Series对象和DataFrame的列数据提供了cat、dt、str三种属性接口(accessors),分别对应分类数据、日期时间数据和字
- 使用QMoive方法实现导入库文件from PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.
- JSON 相关概念:序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON,
- 由于在模型训练的过程中存在大量的随机操作,使得对于同一份代码,重复运行后得到的结果不一致。因此,为了得到可重复的实验结果,我们需要对随机数生
- <?php /** +------------------------------------------------ * 通用的树型
- 如下所示:a[:, np.newaxis] # 给a最外层中括号中的每一个元素加[]a[np.newaxis, :] # 给a最外层中括号中
- 这篇论坛文章详细的讲解了使用SQL Server 2008管理非结构化数据的具体方法,更多内容请参考下文:microsoft SQL Ser
- numpy中轴参数的意义指定的轴是被压缩的轴沿轴的时候可以指定两个轴,即面被压缩,以面作为输入numpy中轴转动numpy中添加新轴np.n
- 安装lxml首先需要pip install lxml安装lxml库。如果你在ubuntu上遇到了以下错误:#include "li
- 本文主要给大家介绍了关于Zabbix 2.4.5自带MySQL监控配置使用的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:一、
- MySQL是“世界上最为流行的开放性数据库”,至少对于MySQL Web站点会这样。但无论
- 摘要: 有个C++项目是读取配置参数文件并打印对应的结果,后来需要多次修改配置文件并运行,于是想到写个python脚本执行这一过程。写一个测
- 1. base64编码简介用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,
- 一.背景一道ctf题,通过破解2048游戏获得flag游戏的规则很简单,需要控制所有方块向同一个方向运动,两个相同数字方块撞在一起之后合并成
- mysql4.1以上版本连接时出现Client does not support authentic
- 复习回顾:Python 对于时间日期操作提供了很多方法,我们前面已经学习了2个模块:基于Unix 时间戳范围限制在1970~2038年的时间
- 本文实例讲述了GO语言make()分配用法。分享给大家供大家参考。具体分析如下:make()分配:内部函数 make(T, args) 的服
- 注:本文是应Alan邀请为《CSS布局实录》写的一个web标准入门指导。书已经上市近一年了,现在摘选出来,给初学者一个参考。希望了解更多实现
- 今天在做sql Server 2005的实验的时候碰到的问题,问题描述很清楚,怀疑是我以前给计算机修改了名称而导致的.可以用select @
- 新建项目如下图,比如sigma目录是我要上传的项目,在six-sigma目录下新建三个文件,分别是LICENSE也就是开源协议,README