当前位置:
首页 > temp > python入门教程 >
-
Python中struct 模块的使用教程
1.struct 简单介绍
struct 是 Python 的内置模块, 在使用 socket 通信的时候, 大多数据的传输都是以二进制流的形式的存在, 而 struct 模块就提供了一种机制, 该机制可以将某些特定的结构体类型打包成二进制流的字符串然后再网络传输,而接收端也应该可以通过某种机制进行解包还原出原始的结构体数据
2.struct 的使用
struct 模块可以将任意大小的数字转换成一个固定长度(可选择)的 bytes, 这个原理类似于前面章节讲过的 hash 算法, 不论内容多大, 最终的 hash 值长度不变, 不同的是 hash 算法是不可逆的, 而且传入的原材料可以是文本、字符串等许多数据类型, struct 可以反解出原来的数据
ps : struct 模块只能转换数字, 不能转换其他的数据类型
3.基本使用 pack 和 unpack
正确使用示例 (打包字节长度对应表请往下看)
import struct
res = struct.pack("i",1234566) # 传入的必须是 int 类型
print(res) # b'\x86\xd6\x12\x00' (查看内容)
print(type(res)) # <class 'bytes'> (查看类型)
res2 = struct.unpack("i",res) # 使用什么 Format 打包就用什么解包
print(res2) # (1234566,) (是个元组)
print(type(res2)) # <class 'tuple'> (查看类型)
print(res2[0]) # 1234566
传入非 int 类型引发的错误示例
import struct
res = struct.pack("i","1231")
# 抛出异常 : struct.error: required argument is not an integer (参数必须是整数)
解包时使用的 Format 不一致错误示例
import struct
res = struct.pack("i",123)
res2 = struct.unpack("q",res)
# struct.error: unpack requires a buffer of 8 bytes
传入多个值
res = struct.pack("hiq",12,23,451312) # 传入多个值, 并使用不同的 Fromat
print(res) # b'\x0c\x00\x00\x00\x17\x00\x00\x00\xf0\xe2\x06\x00\x00\x00\x00\x00'
print(type(res)) # <class 'bytes'>
a,b,c = struct.unpack("hiq",res) # 使用解压赋值,有几个值就需要有几个 Fromat
print(a,b,c) # 12 23 451312
Fromat 与值不一致错误示例
with open("aaa.txt","wb")as f:
for i in range(5):
res = struct.pack("i",i)
f.write(res)
with open("aaa.txt","rb")as f:
res = f.read()
print(res)
a,b,c,d,e= struct.unpack("i",res) # 打包的时候是 5 个值, 解包的时候也要传 5 个值
print(a,b,c,d,e) # 抛出异常 : struct.error: unpack requires a buffer of 4 bytes
打包一个 json 后的信息长度, 在 socket 中可用于发送报头(报头为固定长度)
import struct
import json
dic = {
"header_name" : "a.txt",
"total_size" : 22,
"heash" : "shawn"
} #Python小白学习交流群:725638078
res = json.dumps(dic) # 将报头序列化
lens = struct.pack("i",len(res)) # 将报头的长度传入并打包
lens2 = struct.unpack("i",lens) # 假设通信另一端收到打包的二进制,再进行解包拿到长度
print(lens2) # (60,)
print(lens[0]) # 60
4.打包字节长度对照表
字符(Format) | cType | Python type | Standard size |
---|---|---|---|
x | pad byte | no value | |
c | char | string of length 1 | 1 |
b | signed char | integer | 1 |
B | unsigned char | integer | 1 |
? | _Bool | bool | 1 |
h | short | integer | 2 |
H | unsigned short | integer | 2 |
i | int | integer | 4 |
I(大写i) | unsigned int | integer | 4 |
l(小写L) | long | integer | 4 |
L | unsigned long | integer | 4 |
q | long long | integer | 8 |
Q | unsigned long long | integer | 8 |
f | float | float | 4 |
d | double | float | 8 |
s | charl | string | |
p | charl | string | |
P | void* | integer |
出处:https://www.cnblogs.com/djdjdj123/p/17307821.html
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数