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

x

pad byte

no value

c

char

bytes of length 1

1

b

signed char

integer

1

(1), (2)

B

unsigned char

integer

1

(2)

?

_Bool

bool

1

(1)

h

short

integer

2

(2)

H

unsigned short

integer

2

(2)

i

int

integer

4

(2)

I

unsigned int

integer

4

(2)

l

long

integer

4

(2)

L

unsigned long

integer

4

(2)

q

long long

integer

8

(2)

Q

unsigned long long

integer

8

(2)

n

ssize_t

integer

(3)

N

size_t

integer

(3)

e

(6)

float

2

(4)

f

float

float

4

(4)

d

double

float

8

(4)

s

char[]

bytes

p

char[]

bytes

P

void *

integer

(5)

在 3.3 版更改:添加了对'n''N'格式的支持。

在 3.6 版更改:添加了对'e'格式的支持。

Notes:

  1. '?'转换码对应于_Bool由C99定义的类型。如果此类型不可用,则使用char. 在标准模式下,它总是用一个字节表示。

  2. 当尝试使用任何整数转换代码打包非整数时,如果非整数有一个__index__()方法,则在打包之前调用该方法将参数转换为整数。

    在 3.2 版更改:添加了__index__()对非整数方法的使用。

  3. 'n''N'转换码只适用于本机的大小(选择为默认或与'@'字节顺序字符)。对于标准大小,您可以使用适合您的应用程序的任何其他整数格式。

  4. 对于'f''d''e'转换码,填充表示使用IEEE 754 binary32,binary64或binary16格式( 'f''d''e'分别地),而不管由所述平台中使用的浮点格式的。

  5. 'P'格式字符仅适用于本地字节顺序(选择为默认或与'@'字节顺序字符)。字节顺序字符'='根据主机系统选择使用小端或大端排序。struct 模块不会将此解释为本机排序,因此'P'格式不可用。

  6. IEEE 754 binary16“半精度”类型是在IEEE 754 标准的 2008 年修订版中引入的。它有一个符号位、一个 5 位指数和 11 位精度(显式存储 10 位),并且可以表示近似 精度6.1e-056.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 把数据变成字节流相关推荐

  1. Python使用struct处理二进制

    有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重 ...

  2. Python之struct介绍及详解(与C/C++通信结构体的交互)

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

  3. Python使用struct处理二进制(转)

    转自:https://www.cnblogs.com/gala/archive/2011/09/22/2184801.html 有的时候需要用python处理二进制数据,比如,存取文件,socket操 ...

  4. python之struct详解_Python学习之struct

    准确地讲,Python没有专门处理字节的数据类型.但由于str既是字符串,又可以表示字节,所以,字节数组=str.而在C语言中,我们可以很方便地用struct.union来处理字节,以及字节和int, ...

  5. cython php,【整理】Cython返回C/C++ struct类型数据 | 勤奋的小青蛙

    在封装中,我们可能会返回c/c++ struct类型的数据,那么其实最好的办法就是通过dict进行返回即可. 我想使用C ++代码返回C struct类型数据.但是我遇到了一个编译错误: error: ...

  6. [Python爬虫] 三、数据抓取之Requests HTTP 库

    往期内容提要: [Python爬虫] 一.爬虫原理之HTTP和HTTPS的请求与响应 [Python爬虫] 二.爬虫原理之定义.分类.流程与编码格式 一.urllib 模块 所谓网页抓取,就是把URL ...

  7. python 通达信板块_[python]沪深龙虎榜数据导入通达信的自选板块,并标注于K线图上...

    将沪深龙虎榜数据导入通达信的自选板块,并标注于K线图上 原理:python读取前一次处理完的计算5日后涨跌幅输出的csv文件 文件名前加"[paint]" 安照通达信的画图文件和板 ...

  8. python调用通达信数据_[python]沪深龙虎榜数据导入通达信的自选板块并标注于k线图上...

    [python] 沪深龙虎榜数据导入通达信的自选板块, 并标注于 K 线图上 1 #coding=utf-8 2 3 # 读取 '[paint]' 开头的 csv 文件 4 #copyright @ ...

  9. python - 用struct以及HxD查看浮点数在内存中的存储,默认是双精度浮点数

    In [25]: for i in struct.pack("!d",0.0456):...: print(bin(i)[2:].rjust(8,"0"),en ...

最新文章

  1. 代理模式和装饰者模式
  2. SQL SERVER 2005 CTE(通用表达式)
  3. python 数据验证
  4. 如何从用户体验的角度去做一个网站的页面设计
  5. html框架实验总结,网页设计实训心得
  6. 【开源项目】特斯拉+树莓派实现车牌识别检测系统
  7. python 里什么时候缩进_python什么时候缩进
  8. r psm倾向性匹配_南瓜香料指标psm如何规划季节性广告
  9. 2020没赚到,你真的该好好想想了
  10. 简单的Java商城项目记录
  11. html跑马灯效果代码加速,网页特效_跑马灯特效代码大全一
  12. siamfc代码解读_分析SiamFC
  13. 那些口碑炸裂的免费远程控制软件!
  14. Shell入门之管道
  15. MATLAB颜色的使用
  16. APARNET阿帕网
  17. python prettytable输出对齐_漂亮的输出-----prettytable和colorama的使用
  18. Eclipse报错:The project: WMY which is referenced by the classpath, does not exist.
  19. STM32F103ZET6的芯片工程改为STM32F103C8T6的工程
  20. 二叉树:表达式二叉树转换成中缀式(括弧处理)

热门文章

  1. 2022-2028年中国新零售行业深度调研及投资前景预测报告(全卷)
  2. 安装 sklearn 报错 ImportError: cannot import name Type
  3. Pinia轻量级状态管理
  4. Java开发的环境搭建
  5. visual2017中给C#项目添加配置文件
  6. mapreduce理解_大数据
  7. 详解 Tomcat 的连接数与线程池
  8. SSM框架整合教程(2020最新版)
  9. 全文翻译(二): TVM: An Automated End-to-End Optimizing Compiler for Deep Learning
  10. 功率半导体碳化硅(SiC)技术