python 使用 struct 把数据变成字节流
1 struct 的作用:
可以将数据按照指定的格式转成字节流,
2 struct 里面的函数
2.1 struct.pack(format, v1, v2, ...):
返回一个包含值v1、v2、 ... 根据格式字符串format打包的字节对象。参数必须与格式所需的值完全匹配。
2.2 struct.pack_into(format, buffer, offset, v1, v2, ...):
根据格式字符串format打包值v1 , v2 , ...并将打包的字节写入从位置offset开始的可写缓冲区缓冲区。请注意,偏移量是必需的参数。
2.3 struct.unpack(format, buffer):
根据格式字符串format从缓冲缓冲区(大概是由 打包)解包。结果是一个元组,即使它只包含一个项目。缓冲区的字节大小必须与格式要求的大小相匹配,如.pack(format, ...)calcsize()
2.4 struct.unpack_from(format, /, buffer, offset=0):
根据格式字符串format,从位置offset开始从缓冲区解包。结果是一个元组,即使它只包含一个项目。从位置offset开始的缓冲区大小(以字节为单位)必须至少是格式所需的大小,如 所反映的那样。calcsize()
2.5 struct.iter_unpack(format, buffer):
根据格式字符串format从缓冲区缓冲区中迭代解包。此函数返回一个迭代器,它将从缓冲区读取相同大小的块,直到其所有内容都已被消耗。缓冲区的字节大小必须是格式所需大小的倍数,如 所反映的。calcsize()
2.6 struct.calcsize(format):
返回与格式字符串format对应的结构体(以及由此产生的字节对象)的大小 。pack(format, ...) 这个是3.4之后的新功能,注意format 不能随意输入
字节顺序、大小和对齐方式
默认情况下,C 类型以机器的本机格式和字节顺序表示,并在必要时通过跳过填充字节来正确对齐(根据 C 编译器使用的规则)。
或者,可以使用格式字符串的第一个字符来指示打包数据的字节顺序、大小和对齐方式,如下表所示:
Character |
Byte order |
Size |
Alignment |
---|---|---|---|
|
native |
native |
native |
|
native |
standard |
none |
|
little-endian |
standard |
none |
|
big-endian |
standard |
none |
|
network (= big-endian) |
standard |
none |
格式化字符
格式字符有以下含义;考虑到它们的类型,C 和 Python 值之间的转换应该是显而易见的。'Standard size'列是指使用标准大小时打包值的大小(以字节为单位);也就是说,当格式字符串中的一个开始'<'
,'>'
,'!'
或 '='
。使用本机大小时,打包值的大小取决于平台。
Format |
C Type |
Python type |
Standard size |
Notes |
---|---|---|---|---|
|
pad byte |
no value |
||
|
|
bytes of length 1 |
1 |
|
|
|
integer |
1 |
(1), (2) |
|
|
integer |
1 |
(2) |
|
|
bool |
1 |
(1) |
|
|
integer |
2 |
(2) |
|
|
integer |
2 |
(2) |
|
|
integer |
4 |
(2) |
|
|
integer |
4 |
(2) |
|
|
integer |
4 |
(2) |
|
|
integer |
4 |
(2) |
|
|
integer |
8 |
(2) |
|
|
integer |
8 |
(2) |
|
|
integer |
(3) |
|
|
|
integer |
(3) |
|
|
(6) |
float |
2 |
(4) |
|
|
float |
4 |
(4) |
|
|
float |
8 |
(4) |
|
|
bytes |
||
|
|
bytes |
||
|
|
integer |
(5) |
在 3.3 版更改:添加了对'n'
和'N'
格式的支持。
在 3.6 版更改:添加了对'e'
格式的支持。
Notes:
的
'?'
转换码对应于_Bool
由C99定义的类型。如果此类型不可用,则使用char
. 在标准模式下,它总是用一个字节表示。当尝试使用任何整数转换代码打包非整数时,如果非整数有一个
__index__()
方法,则在打包之前调用该方法将参数转换为整数。在 3.2 版更改:添加了
__index__()
对非整数方法的使用。的
'n'
和'N'
转换码只适用于本机的大小(选择为默认或与'@'
字节顺序字符)。对于标准大小,您可以使用适合您的应用程序的任何其他整数格式。对于
'f'
,'d'
和'e'
转换码,填充表示使用IEEE 754 binary32,binary64或binary16格式('f'
,'d'
或'e'
分别地),而不管由所述平台中使用的浮点格式的。该
'P'
格式字符仅适用于本地字节顺序(选择为默认或与'@'
字节顺序字符)。字节顺序字符'='
根据主机系统选择使用小端或大端排序。struct 模块不会将此解释为本机排序,因此'P'
格式不可用。IEEE 754 binary16“半精度”类型是在IEEE 754 标准的 2008 年修订版中引入的。它有一个符号位、一个 5 位指数和 11 位精度(显式存储 10 位),并且可以表示近似 精度
6.1e-05
和6.5e+04
全精度之间的数字。C 编译器并不广泛支持这种类型:在典型机器上,无符号短整型可用于存储,但不能用于数学运算。有关更多信息,请参阅有关半精度浮点格式的维基百科页面。
以上内容参考python 官网教程地址链接
基本知识了解完之后开始使用,
demo 说明struct 的使用
demo1 将数字3转成1个字节流
从上面的字符表格中可以看到转成1个字节流的是B 和b
import struct# 把3转成1个字节
num_a = struct.pack("B", 3)
print(num_a)
print(struct.pack("b", 3))
# 将字符流解包
num_b = struct.unpack("B", num_a)
print(num_b)
运行打印的结果如下:
demo2 将数字3转成2个字节流
从上面的字符表格中可以看到转成1个字节流的是H和h
import struct# 把3转成1个字节
num_a = struct.pack("H", 3)
print(num_a)
print(struct.pack("h", 3))
# 将字符流解包
num_b = struct.unpack("H", num_a)
print(num_b)
打印结果如下:
demo3 多个数据转字节流
import struct# 把3转成1个字节,100转成2个字节
num_a = struct.pack("BH", 3, 100)
print(num_a)
# 将字符流解包
num_b = struct.unpack("BH", num_a)
print(num_b)
# 查看BH组合占多个字节
print(struct.calcsize('BH'))
打印结果如下:
--------------------------------待思考问题-----------------------------
多个字节组合在一起,字节感觉变的没有规律了,比如1和字节和2个字节组合在一起是4个字节, 目前不知道为啥?
比如
print(struct.pack("BH", 2, 3))
print(struct.calcsize("BH"))
打印结果:
这个时候4个字节
修改一下
print(struct.pack("HB", 2, 3))
print(struct.calcsize("HB"))
打印结果:
这个时候3个字节,
我是被这个弄晕了,不知道为啥。
python 使用 struct 把数据变成字节流相关推荐
- Python使用struct处理二进制
有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重 ...
- Python之struct介绍及详解(与C/C++通信结构体的交互)
用处 按照指定格式将Python数据转换为字符串,该字符串为字节流,如网络传输时,不能传输int,此时先将int转化为字节流,然后再发送; 按照指定格式将字节流转换为Python指定的数据类型; 处理 ...
- Python使用struct处理二进制(转)
转自:https://www.cnblogs.com/gala/archive/2011/09/22/2184801.html 有的时候需要用python处理二进制数据,比如,存取文件,socket操 ...
- python之struct详解_Python学习之struct
准确地讲,Python没有专门处理字节的数据类型.但由于str既是字符串,又可以表示字节,所以,字节数组=str.而在C语言中,我们可以很方便地用struct.union来处理字节,以及字节和int, ...
- cython php,【整理】Cython返回C/C++ struct类型数据 | 勤奋的小青蛙
在封装中,我们可能会返回c/c++ struct类型的数据,那么其实最好的办法就是通过dict进行返回即可. 我想使用C ++代码返回C struct类型数据.但是我遇到了一个编译错误: error: ...
- [Python爬虫] 三、数据抓取之Requests HTTP 库
往期内容提要: [Python爬虫] 一.爬虫原理之HTTP和HTTPS的请求与响应 [Python爬虫] 二.爬虫原理之定义.分类.流程与编码格式 一.urllib 模块 所谓网页抓取,就是把URL ...
- python 通达信板块_[python]沪深龙虎榜数据导入通达信的自选板块,并标注于K线图上...
将沪深龙虎榜数据导入通达信的自选板块,并标注于K线图上 原理:python读取前一次处理完的计算5日后涨跌幅输出的csv文件 文件名前加"[paint]" 安照通达信的画图文件和板 ...
- python调用通达信数据_[python]沪深龙虎榜数据导入通达信的自选板块并标注于k线图上...
[python] 沪深龙虎榜数据导入通达信的自选板块, 并标注于 K 线图上 1 #coding=utf-8 2 3 # 读取 '[paint]' 开头的 csv 文件 4 #copyright @ ...
- python - 用struct以及HxD查看浮点数在内存中的存储,默认是双精度浮点数
In [25]: for i in struct.pack("!d",0.0456):...: print(bin(i)[2:].rjust(8,"0"),en ...
最新文章
- 代理模式和装饰者模式
- SQL SERVER 2005 CTE(通用表达式)
- python 数据验证
- 如何从用户体验的角度去做一个网站的页面设计
- html框架实验总结,网页设计实训心得
- 【开源项目】特斯拉+树莓派实现车牌识别检测系统
- python 里什么时候缩进_python什么时候缩进
- r psm倾向性匹配_南瓜香料指标psm如何规划季节性广告
- 2020没赚到,你真的该好好想想了
- 简单的Java商城项目记录
- html跑马灯效果代码加速,网页特效_跑马灯特效代码大全一
- siamfc代码解读_分析SiamFC
- 那些口碑炸裂的免费远程控制软件!
- Shell入门之管道
- MATLAB颜色的使用
- APARNET阿帕网
- python prettytable输出对齐_漂亮的输出-----prettytable和colorama的使用
- Eclipse报错:The project: WMY which is referenced by the classpath, does not exist.
- STM32F103ZET6的芯片工程改为STM32F103C8T6的工程
- 二叉树:表达式二叉树转换成中缀式(括弧处理)
热门文章
- 2022-2028年中国新零售行业深度调研及投资前景预测报告(全卷)
- 安装 sklearn 报错 ImportError: cannot import name Type
- Pinia轻量级状态管理
- Java开发的环境搭建
- visual2017中给C#项目添加配置文件
- mapreduce理解_大数据
- 详解 Tomcat 的连接数与线程池
- SSM框架整合教程(2020最新版)
- 全文翻译(二): TVM: An Automated End-to-End Optimizing Compiler for Deep Learning
- 功率半导体碳化硅(SiC)技术