struct模块的使用

2020年12月4日 / 70次阅读 / Last Modified 2020年12月5日

终于搞懂了python标准库中struct模块的使用。

struct模块可以用来生成符合C语言特点的struct内存块,即这样的 byte string。

C语言特点的struct内存块有什么特点:struct中每个元素的其实地址是对齐的。比如含有1个char元素和1个int元素的struct,sizeof的结果是8,中间有3个bytes的hole!

>>> import struct
>>> struct.pack('ci',b'1',1)
b'1\x00\x00\x00\x01\x00\x00\x00'
>>> len(struct.pack('ci',b'1',1))
8

'ci'是格式符号,表示1个char后跟1个int。具体请参考:https://docs.python.org/3/library/struct.html#format-characters

也可以显示去掉对齐时的padding:

>>> struct.pack('ci',b'1',1)
b'1\x00\x00\x00\x01\x00\x00\x00'
>>> struct.pack('@ci',b'1',1)  # @ is default
b'1\x00\x00\x00\x01\x00\x00\x00'
>>> struct.pack('=ci',b'1',1)  # use = to eliminate padding
b'1\x01\x00\x00\x00'

默认情况下,struct.pack生产的结构体内存块,每个元素的字节序是native的,即跟本机CPU的字节序一致。如果是在开发网络应用,很可能就需要生成网络序的内存块,而这时也是不需要padding的:

>>> struct.pack('>> struct.pack('>cic',b'1',2,b'3')  # big
b'1\x00\x00\x00\x023'
>>> struct.pack('!cic',b'1',2,b'3')  # network
b'1\x00\x00\x00\x023'

生成一个字符串,用0x00做padding:

>>> struct.pack('16s',b'1234')
b'1234\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

可以pack,当然也可以unpack。

struct.unpack就是反过来,将一个 byte string,按照 format string,将一个个的元素映射出来。

>>> struct.unpack('ci', struct.pack('ci', b'1',2))
(b'1', 2)
>>> struct.unpack('cic', struct.pack('cic', b'1',2,b'3'))
(b'1', 2, b'3')
>>> struct.unpack('=cic', struct.pack('=cic', b'1',2,b'3'))
(b'1', 2, b'3')
>>> struct.unpack('!cic', struct.pack('!cic', b'1',2,b'3'))
(b'1', 2, b'3')

浮点数与bytes之间的转换!得到浮点数的bytes:

>>> struct.unpack('f', struct.pack('f', 3.1415))
(3.1414999961853027,)
>>> struct.unpack('d', struct.pack('d', 3.1415))
(3.1415,)

int与bytes之间的转换!

>>> struct.unpack('I', struct.pack('I', 123))
(123,)
>>> struct.unpack('L', struct.pack('L', 123))
(123,)

struct模块的其他函数:

  • struc.pack_into,可以将pack后的byte string,按offset插入某一个buffer;
  • struct.unpack_from,从某个buffer的offset开始unpack;
  • struct.iter_unpack,一个iterator,按一个固定的format,循环unpack;
  • struct.calcsize,计算format的长度。

-- EOF --

本文链接:https://www.pynote.net/archives/2981

相关文章

    留言区

    您的电子邮箱地址不会被公开。 必填项已用*标注


    前一篇:
    后一篇:

    More


    ©Copyright 麦新杰 Since 2019 Python笔记

    go to top