用处
- 按照指定格式将Python数据转换为字符串,该字符串为字节流,如网络传输时,不能传输int,此时先将int转化为字节流,然后再发送;
- 按照指定格式将字节流转换为Python指定的数据类型;
- 处理二进制数据,如果用struct来处理文件的话,需要用’wb’,’rb’以二进制(字节流)写,读的方式来处理文件;
- 处理c语言中的结构体;
struct模块中的主要函数
struct.pack(fmt,v1,v2,.....):按照给定的格式(fmt),把数据转换成字符串(字节流),并将该字符串返回
struct.unpack(fmt,string):按照给定的格式(fmt)解析以offset开始的缓冲区,并返回解析结果(tuple)
import struct
a=struct.pack("ihb", 1, 2, 3)
print(a) #b'\x01\x00\x00\x00\x02\x00\x03'
print(struct.unpack("ihb",a)) #(1, 2, 3)
-------------------------------------------------------
import struct
s1 = struct.Struct('I4sf')
values1 = (1, b'good', 1.22)
a=s1.pack(*values1)
print(a) #b'\x01\x00\x00\x00good\xf6(\x9c?'
print(s1.unpack(a)) #(1, b'good', 1.2200000286102295)
pack_into(fmt,buffer,offset,v1,v2…):按照给定的格式(fmt),将数据转换成字符串(字节流),并将字节流写入以offset开始的buffer中
pack_from(fmt,buffer,offset):按照给定的格式(fmt)解析以offset开始的缓冲区,并返回解析结果(tuple)
import struct
import binascii
import ctypes
values = (1, b'good', 1.22) #查看格式化字符串可知,字符串必须为字节流类型。
s =struct.Struct('I4sf')
buff = ctypes.create_string_buffer(s.size)
packed_data = s.pack_into(buff,0,*values)
unpacked_data = s.unpack_from(buff,0)
print('Original values:', values)
print('Format string :', s.format)
print('buff :', buff)
print('Packed Value :', binascii.hexlify(buff))
print('Unpacked Type :', type(unpacked_data),' Value:', unpacked_data)
'''
Original values: (1, b'good', 1.22)
Format string : b'I4sf'
buff : <ctypes.c_char_Array_12 object at 0x000001CC5AC319C8>
Packed Value : b'01000000676f6f64f6289c3f'
Unpacked Type : <class 'tuple'> Value: (1, b'good', 1.2200000286102295)
'''
对齐方式
Character | Byte order | Size | Alignment |
---|---|---|---|
@(默认) | 本机 | 本机 | 本机,凑够4字节 |
= | 本机 | 标准 | none,按原字节数 |
< | 小端 | 标准 | none,按原字节数 |
> | 大端 | 标准 | none,按原字节数 |
! | network(大端) | 标准 | none,按原字节数 |
如果不懂大小端,见大小端参考网址.
格式符