Python
struct
模块用于将外部压缩的格式字符串与Python类型值进行转换,用于外部文件,网络数据,或是python 与 c语言程序 间的数据交换。
简介 {#简介}
struct
是 Python 中用于格式转换的工具包,核心方法有 pack
和 unpack
struct.pack
将输入的值根据对应的格式进行压缩,并返回对应压缩后的二进制串。
struct.unpack
则是用于将外部压缩的格式字符串进行解压(一般是对 struct.pack
函数压缩的数据进行解压),同时返回结果为一个元组,且解压的数据大小必须满足格式指定的字节数。
函数使用 {#函数使用}
引入包 {#引入包}
函数格式 {#函数格式}
pack
| format | v1, v2, ... | |---------------------------------------|-----------------------------------| | format描述需要数据的格式,具体内容见下述format strings | 需要进行压缩的值,需要注意的是这些值必须与format的格式相匹配 |
unpack
| format | buffer | |-----------------------------------------|------------| | format描述了解包数据的格式,具体内容见下述 format strings | 进行解包的缓冲区数据 |
Format Strings {#Format-Strings}
format strings
的第一个字符为一个特殊字符,用于表示相关的控制信息,若第一个字符并不为指定表中字符,则取默认值,并将第一个字符按 format character
处理。剩余的字符则对应相应的 format character
表示具体的数据交换格式。其中每个 format character
前面都有一个可选数字用于表示该字符匹配的数量。
第一个字符 {#第一个字符}
format 里的第一个字符用于表示字节顺序、数据读取的大小表示、对齐方式。
其中各个字符代表的含义如下所示:
{#fnref:1}{#fnref:2}
| 字符 | 字节顺序 | 大小表示 | 对齐方式 | |----|--------------------|--------------------|------| | @ | 本地^[1]^ | 本地 | 本地 | | = | 本地 | 标准^[2]^ | 无 | | < | 小端 | 标准 | 无 | | > | 大端 | 标准 | 无 | | ! | 网络(总是大端) | 标准 | 无 |
如果第一个字符不是这些字符之一,默认为@。并将第一个字符按format character处理。
Format Character {#Format-Character}
format character
则是接在第一个字符后用于表示数据转换时对应的数据类型,如字符 f
则表示将C语言的float
类型转换为 Python 的 float
类型。同时该字符前可增加一个可选数字用于表示该字符匹配的数量,如 4f
则表示匹配 4 个 float
类型的数据。更多字符表示详见下表。
同时若指定的大小表示类型为标准,则以下表的数据类型大小为准,若指定的大小表示类型为本地,则取本机数据C语言 sizeof
指定的数据类型大小。
{#fnref:3}{#fnref:4}{#fnref:4}{#fnref:5}{#fnref:6}{#fnref:7}{#fnref:8}
| 字符 | C类型 | Python类型 | 标准大小 | |----|--------------------|------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | x | 填充字节 | 无对应值 | -^[3]^ | | c | char | 长度为1的bytes | 1 | | b | signed char | integer | 1 | | B | unsigned char | integer | 1 | | ? | _Bool | bool | 1 | | h | short | integer | 2 | | H | unsigned char | integer | 2 | | i | int | integer | 4 | | I | unsigned int | integer | 4 | | l | long | integer | 4 | | L | unsigned long | integer | 4 | | q | long long | integer | 8 | | Q | unsigned long long | integer | 8 | | n | ssize_t | integer | -^[4]^ | | N | size_t | integer | -^[4]^ | | e | -^[5]^ | float | 2 | | f | float | float | 4 | | d | double | float | 8 | | s | char[] | bytes | -^[6]^ | | p | char[] | bytes | -^<span class="hint--top hint--rounded" aria-label="该字符表示的为"Pascal字符串"。其第一个字节用于存储该字符串的长度length,在pack函数中使用该字符时,只会压缩后面length-1的字符串,超出部分则截断,短缺部分则用空字节填充。注意因仅有一字节的长度位,该字符串的长度最多为255。">[7]^ | | P | void* | integer | -^[8]^ |
示例代码 {#示例代码}
对相同的数字按 short,int,long,long long
进行压缩和解压
压缩和解压指定长度的数字
采用@按本机4字节进行对齐
进行字符串的压缩和解压
使用x进行字节填充
参考资料 {#参考资料}
- https://blog.csdn.net/eliforsharon/article/details/128545037
- https://docs.python.org/3/library/struct.html#format-characters
- 本地的字节顺序取决于你主机系统的字节顺序,如Intel x86, AMD64 (x86-64)和Apple M1用的是小端的字节顺序,IBM z用的大端的字节顺序。本地的大小表示和对齐方式则是C语言sizeof的表示方式。 ↩{#fn:1}
- 标准的大小表示取决于格式字符类型对应的大小,详见Format Character。
↩{#fn:2} - 填充字节用于pack时插入一个空字节。 ↩{#fn:3}
- 这两个字符只用于本地的大小表示(即第一个字符为@或取默认值)。 ↩︎
↩{#fn:4} - 该字符用于表示由IEEE 754 standard提出的半精度浮点数,其由1bit符号位,5bit指数位,11bit精度位组成。 ↩{#fn:5}
- 该字符的大小表示为字节的总长度,所以我们需要用数字加在字符前用于限定字节的总长度。如10s则表示10字节的字符串。
↩{#fn:6} - 该字符表示的为"Pascal字符串"。其第一个字节用于存储该字符串的长度length,在pack函数中使用该字符时,只会压缩后面length-1的字符串,超出部分则截断,短缺部分则用空字节填充。注意因仅有一字节的长度位,该字符串的长度最多为255。 ↩{#fn:7}
- 该字符只用于本地的字节顺序表示(即第一个字符为@或取默认值)。注意该字符并不适用于第一个字符为=,即使它也采用本地的字节顺序表示。
↩{#fn:8}
文章链接:
https://www.zywvvd.com/notes/coding/python/python-struct/python-struct/