­

python3中的struct模块使用

  • 2020 年 1 月 10 日
  • 筆記

软硬件环境

  • python3
  • struct

简介

struct是python(包括版本2和3)中的内建模块,它用来在c语言中的结构体与python中的字符串之间进行转换,数据一般来自文件或者网络。

常用方法

struct模块中的函数

函数

return

explain

pack(fmt,v1,v2…)

string

按照给定的格式(fmt),把数据转换成字符串(字节流),并将该字符串返回.

pack_into(fmt,buffer,offset,v1,v2…)

None

按照给定的格式(fmt),将数据转换成字符串(字节流),并将字节流写入以offset开始的buffer中.(buffer为可写的缓冲区,可用array模块)

unpack(fmt,v1,v2…..)

tuple

按照给定的格式(fmt)解析字节流,并返回解析结果

pack_from(fmt,buffer,offset)

tuple

按照给定的格式(fmt)解析以offset开始的缓冲区,并返回解析结果

calcsize(fmt)

size of fmt

计算给定的格式(fmt)占用多少字节的内存,注意对齐方式

struct.pack(fmt,v1,v2,…)

返回的是一个字符串,是参数按照fmt数据格式组合而成。

struct.unpack(fmt,string)

按照给定数据格式解开(通常都是由struct.pack进行打包)数据,返回值是一个tuple

对齐方式

为了同c中的结构体交换数据,还要考虑c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下

Character

Byte order

Size

Alignment

@(默认)

本机

本机

本机,凑够4字节

=

本机

标准

none,按原字节数

<

小端

标准

none,按原字节数

>

大端

标准

none,按原字节数

!

network(大端)

标准

none,按原字节数

如果不懂大小端,见大小端参考网址.

Format

C Type

Python type

Standard size

Notes

x

pad byte

no value

c

char

string of length 1

1

b

signed char

integer

1

(3)

B

unsigned char

integer

1

(3)

?

_Bool

bool

1

(1)

h

short

integer

2

(3)

H

unsigned short

integer

2

(3)

i

int

integer

4

(3)

I

unsigned int

integer

4

(3)

l

long

integer

4

(3)

L

unsigned long

integer

4

(3)

q

long long

integer

8

(2), (3)

Q

unsigned long long

integer

8

(2), (3)

f

float

float

4

(4)

d

double

float

8

(4)

s

char[]

string

p

char[]

string

P

void *

integer

(5), (3)

实例

理论性的东西看起来都比较枯燥,来个实例代码就容易理解多了。本例来实现往一个2进制文件中按照某种特定格式写入数据,之后再将它读出。相信通过这个理例子,你就能基本掌握struct的使用。

# -*- coding: utf-8 -*-  __author__ = 'djstava'    '''  数据格式为  姓名 年龄 性别   职业  lily 18  female teacher  '''    import os  import struct    fp = open('test.bin','wb')    # 按照上面的格式将数据写入文件中  # 这里如果string类型的话,在pack函数中就需要encode('utf-8')  name = b'lily'  age = 18  sex = b'female'  job = b'teacher'    # int类型占4个字节  fp.write(struct.pack('4si6s7s', name,age,sex,job))  fp.flush()  fp.close()    # 将文件中写入的数据按照格式读取出来  fd = open('test.bin','rb')  # 21 = 4 + 4 + 6 + 7  print(struct.unpack('4si6s7s',fd.read(21)))  fd.close()

运行上面的代码,可以看到读出的数据与写入的数据是完全一致的。

/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/djstava/Playground/flaskPy/test.py  (b'lily', 18, b'female', b'teacher')    Process finished with exit code 0