1. Python标准库笔记(6) — struct模块
struct模块为Python提供了一个桥梁,使得Python数值与C语言结构体的Python字符串形式之间能够轻松转换。适用于处理存储在文件中或网络连接中的二进制数据,以及其它数据源。
该模块除了提供一个名为`Struct`的类外,还有多个模块级函数处理结构化值。格式符是关键概念,与正则表达式相似,用于从字符串格式转换为编译表示形式。通常,实例化`Struct`类并调用其方法比直接调用模块函数更高效。下面的例子都使用`Struct`类。
struct支持将数据打包成字符串,并能从字符串中逆向解包出数据。格式指定器需要整型、长整型、两个字节的字符串和浮点数。空格在编译格式时会被忽略。此示例将打包的值转换为十六进制字节序列,并使用`binascii.hexlify()`方法打印。使用`unpack()`方法解包。打包的值传给`unpack()`后,基本返回相同的值(浮点数有微小差异)。
默认情况下,pack使用本地C库的字节顺序。格式化字符串的第一个字符用于表示填充数据的字节顺序、大小和对齐方式。默认使用`@`。本地字节顺序由当前主机系统决定,如Intel x86和AMD64使用小字节序,Motorola 68000和PowerPC G5使用大字节序,ARM和Intel安腾支持切换字节序。使用`sys.byteorder`查看当前系统的字节顺序。
本地大小和对齐是由c编译器的`sizeof`表达式决定的,与本地字节顺序对应。标准大小由格式符决定。示例如下。
格式符对照表如下。
打包和解包时,性能优化是关键。在性能要求高的场景中,可通过避免每次打包结构分配新缓冲区的开销,优化`pack_into()`和`unpack_from()`方法。直接写入预先分配的缓冲区是实现这一目标的有效策略。