Python的内置模块struct学习笔记

python处理二进制数据时可以使用python的struct模块。

struct模块中最重要的三个函数是pack(), unpack(), calcsize():

pack(fmt, v1, v2, ...)     按照给定的格式(fmt),返回一个包装后的字符串

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

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

struct中支持的格式如下表:

可以用格式(fmt)中的第一个字符来改变对齐方式。定义如下:

如果没有附加,默认为@。

例子如下:

扫描二维码关注公众号,回复: 3964825 查看本文章
>>> import struct
>>> a = struct.pack('ihb',1,2,3)
>>> a
b'\x01\x00\x00\x00\x02\x00\x03'
>>> b = struct.unpack('ihb',a)
>>> b
(1, 2, 3)

首先将参数1,2,3打包。

打包前1,2,3明显属于python数据类型中的integer,打包后就成了C结构的二进制串。

转成python的string类型来显示就是'\x01\x00\x00\x00\x02\x00\x03'。由于本机是小端因此高位放在低地址段。

i:代表C结构中的int类型,占4位,表示为01000000;
h:代表C结构中的short类型,占2位,表示为0200;
b:代表C结构中的signed char类型,占1位,表示为03。

再来看一个例子:

>>> a = struct.pack('!ihb',1,2,3)
>>> a
b'\x00\x00\x00\x01\x00\x02\x03'
>>> b = struct.unpack('!ihb',a)
>>> b
(1, 2, 3)

使用的format string中首位为'!',即为大端模式标准对齐方式。

故而输出为'\x00\x00\x00\x01\x00\x02\x03',其中高位就被放在内存的高地址位了。

猜你喜欢

转载自blog.csdn.net/qq_36309480/article/details/83000087