2020年12月4日 / 41次阅读 / 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模块的其他函数:
-- EOF --
本文链接:https://www.pynote.net/archives/2981
Ctrl+D 收藏本页
©Copyright 麦新杰 Since 2019 Python笔记