详细使用参考官方文档 : https://docs.python.org/zh-cn/2/library/struct.htmlhtml
struct 是 Python 的内置模块, 在使用 socket 通讯的时候, 大多数据的传输都是以二进制流的形式的存在, 而 struct 模块就提供了一种机制, 该机制能够将某些特定的结构体类型打包成二进制流的字符串而后再网络传输,而接收端也应该能够经过某种机制进行解包还原出原始的结构体数据python
struct 模块能够将任意大小的数字转换成一个固定长度(可选择)的 bytes, 这个原理相似于前面章节讲过的 hash 算法, 不论内容多大, 最终的 hash 值长度不变, 不一样的是 hash 算法是不可逆的, 并且传入的原材料能够是文本、字符串等许多数据类型, struct 能够反解出原来的数字算法
ps : struct 模块只能转换数字, 不能转换其余的数据类型json
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
import struct res = struct.pack("i","1231") # 抛出异常 : struct.error: required argument is not an integer (参数必须是整数)
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
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
import struct import json dic = { "header_name" : "a.txt", "total_size" : 22, "heash" : "shawn" } res = json.dumps(dic) # 将报头序列化 lens = struct.pack("i",len(res)) # 将报头的长度传入并打包 lens2 = struct.unpack("i",lens) # 假设通讯另外一端收到打包的二进制,再进行解包拿到长度 print(lens2) # (60,) print(lens[0]) # 60
字符(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 |