已安装Python 3.6或以上版本;
启动IDLE程序(必须安装Python 3),点击界面菜单中的“File > New File”,新建一个空白的Python源代码文件,然后保存为“study_struct_module.py”文件;
Python 3中的struct模块提供了一系列的打包和解包函数以及一个名为Struct的类。这两种方式在功能上并没有区别,你可以根据代码环境自由选择。通过struct.pack函数,可以将数据按照指定的格式(请参考Python 3帮助手册,搜索“struct”)打包到字节流中。而通过struct.unpack函数,则可以将字节流中的数据按指定的格式还原为Python数据;
清楚了struct模块的打包和解包用法后,接下来,可以通过代码体验一下它们的具体用法。在“study_struct_module.py”源代码文件中,导入struct模块,然后在try…except(struct模块执行错误会抛出struct.error异常)中添加打包Python数据的代码并输出打包后的数据。代码编写完毕后,点击F5运行程序。一切正常时,可以在Shell窗口中见到输出的结果;
继续向源代码的try…except中添加解包字节流并输出解包数据的代码,然后点F5运行。一切正常时,可以在Shell窗口中见到解包后的数据与最初传入的数据相同,除了那个0.1535,这个实际是浮点数的误差,属于正常现象;
Python的struct模块中同时提供了Struct类,通过该类的pack和unpack方法,同样可以打包和解包二进制数据。调用时,需要注意传入的参数类型,别跟同名的函数弄混了,它可以Struct对象;
向源代码的try…except中追加通过Struct类对象打包和解包数据的代码,然后按F5运行。核对Shell窗口中打印的数据,可以确定其结果与struct函数输出的一致;
struct模块中提供了struct.pack_into和struct.unpack_from函数,用于将数据打包到缓冲区(比如:array对象),以及从缓冲区中解包数据。使用pack_into函数时,需要提供一个可写的缓冲区,可以通过array模块中提供的array函数创建,在创建array对象时,可以传入一个推导列表用于设置array的长度;
继续向源代码文件的try…except块中添加“打包数据到缓冲区”的测试代码。代码编写完之后,点击F5运行。在Shell窗口中,可以见到打包数据的输出结果,直接用print输出array时,它会以array的存储格式输出数据。将其转换为二进制后,输出的结果就与之前的一致了;
继续向源代码文件的try…except块中添加“从缓冲区解包数据”的测试代码,然后按F5运行。在Shell窗口中,可以见到与之前输出一致的解码数据;
struct模块还提供了一个以固定格式遍历解包字节流的函数iter_unpack。主要用在for..in循环中,以固定格式解码字节流中的所有数据;
继续向源代码文件的try…except块中追加“以字符格式遍历解包字节流”的代码,然后按F5运行。代码运行结束后,可以在Shell窗口中见到打印的所有字节数据。由于struct.iter_unpack返回的是一个iterator,所以输出的数据格式都是iterator的格式;
至此,Python中struct模块的基本用法就介绍完毕了,下一篇文章中,我会向大家介绍一下在Python中通过二进制文件与C++代码进行交互的方法。敬请期待!Enjoy!~