python struct模块_python struct 模块

struct模块用于二进制和结构体之间的互相转化,此模块中大部分函数接受一个实现了Buffer协议的对象,最常见的实现了Buffer协议的对象包括bytes、bytearray等,大多数像byte数组这样的对象都实现了Buffer协议。

struct模块的函数

struct模块的函数很少,只有6个。

struct.pack(format, v1, v2, ...):将多个value如v1、v2按照format进行格式化

struct.pack_into(format, buffer, offset, v1, v2, ...):将多个value如v1、v2按照format格式化到buffer的offset处

struct.unpack(format, buffer):从buffer中按照format解析对象

struct.unpack_from(format, buffer, offset=0):从buffer的某个offset处解析对象

struct.iter_unpack(format, buffer):以迭代的形式从buffer中解析对象

struct.calcsize(format):返回format所指定的数据类型的字节数

从以上函数看出,struct模块中格式化字符串format非常重要,format包括两部分:控制部分、类型部分。

以Struct的形式调用struct包的能

struct包提供了Struct类,这个类的构造函数接受一个format串,从而可以使用对象的函数了,可以避免传format参数。

msgpack中的Packer和Unpacker也是类似的作用。

举例

demo1:将int转换为bytes

buf1 = 256

bin_buf1 = struct.pack('i', buf1) # 'i'代表'integer'

ret1 = struct.unpack('i', bin_buf1)

print(bin_buf1, ' <====> ', ret1)

这段程序将256这个数字通过pack函数转化成了bytes类型,其中pack的第一个参数i表示buf1为int类型的数据。

demo2:将浮点数转化为bytes

buf2 = 3.1415

bin_buf2 = struct.pack('d', buf2) # 'd'代表'double'

ret2 = struct.unpack('d', bin_buf2)

print(bin_buf2, ' <====> ', ret2)

demo3:将字符串转换为bytes

# 字符串 -> 二进制流

buf3 = 'Hello World'

bin_buf3 = struct.pack('11s', bytes(buf3,encoding='ascii')) # '11s'代表长度为11的'string'字符数组

ret3 = struct.unpack('11s', bin_buf3)

print(bin_buf3, ' <====> ', ret3)

这里的11s表示buf3为长度11个字符的数组。同理,也可以使用“11i”表示11个int类型的数据,还可以使用“iiiiiiiiiii”表示11i

demo4:将结构体转化为bytes

# 结构体 -> 二进制流

# 假设有一个结构体

# struct header {

# int buf1;

# double buf2;

# char buf3[11];

# }

bin_buf_all = struct.pack('id11s', buf1, buf2, bytes(buf3,encoding='ascii'))

ret_all = struct.unpack('id11s', bin_buf_all)

print(bin_buf_all, ' <====> ', ret_all)

demo5:常用方法

# 按照给定的格式化字符串,把数据封装成字符串(实际上是类似于c结构体的字节流)

string = struct.pack(fmt, v1, v2, ...)

# 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple

tuple = unpack(fmt, string)

# 计算给定的格式(fmt)占用多少字节的内存

offset = calcsize(fmt)

手册

格式化字符串的存储部分

从表中可以发现如下规律:

整数类型b、h、i、q分别表示1个字节、2个字节、4个字节、8个字节,对应的大写字母表示无符号整数

f、d表示float和double

c表示字符、s表示字符串,需要注意:struct模块并不能直接将str类型转为bytes,当format为c和s时,对象需要是byte类型或者bytes类型

FormatC TypePython字节数

x

pad byte

no value

1

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

unsigned int

integer or lon

4

l

long

integer

4

L

unsigned long

long

4

q

long long

long

8

Q

unsigned long long

long

8

f

float

float

4

d

double

float

8

s

char[]

string

1

p

char[]

string

1

P

void *

long

格式化字符串的控制部分

@表示默认,一切以本地为主

=表示对象的大小使用标准大小

表示小头序和大头序

!永远不会用到,可以忽略

CharacterByte orderSize and alignment

@

native

native 凑够4个字节

=

native

standard 按原字节数

<

little-endian

standard 按原字节数

>

big-endian

standard 按原字节数

!

network (= big-endian)

standard 按原字节数

#参考资料 [monitor1379](http://www.jianshu.com/p/5a985f29fa81)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值