多语言展示
当前在线:1470今日阅读:26今日分享:39

[Python3] 通过二进制文件与C++程序交互[TZZ]

大家好!今天我准备跟大家谈谈“Python中通过二进制文件与C++程序交互的方法”。在Python中,为了生成C++程序可以读取的二进制文件,需要通过struct模块将Python数据打包成C语言数据类型,然后以二进制方式存储到文件中。为了保证文件的写入方和读取方都能以一致的方式进行交互,我们需要自定义一种文件内部数据的存储格式(本示例中采用:[文件标志(3字节))][数据长度(4字节)][数据流(字节数等于数据长度)]的文件存储结构)。如果您觉得这篇教程有帮助,请为我投上宝贵的一票,谢谢!如果您对我写的系列教程感兴趣,请给我个“关注”吧!3Python3安装教程[TZZ]
工具/原料

已安装Python 3.6或以上版本;

方法/步骤
1

启动IDLE程序(必须安装Python 3),点击界面菜单中的“File > New File”,新建一个空白的Python源代码文件,然后保存为“interact_with_cpp.py”文件;

2

向源码文件中添加“按照文件格式写入二进制文件的代码”。在这份代码中,定义一个名为“write”的函数。在该函数中,创建了一个20字节的字节数组“packed”,然后通过struct.pack_into函数(其中“3s”表示3个字节的char数组)将文件标志保存到了packed中,同时修正字节数组中下一次写入数据的偏移位置offset(文件可以看做是一个巨大的一维数组)。接着,将文件长度打包存储到字节数组中,最后通过一个for..in循环分别写入len个字节充当字节内容。

3

继续向源码文件中追加“调用write函数的测试代码”。在这份代码中,通过open函数创建/打开了一个二进制文件,然后调用write函数将交互数据写入打开的文件中(Python中写入文件的方法可以参考引用文章)。代码编写完毕后,点击F5运行程序,见到打印信息且未出现任何错误提示,则表示代码运行正常;

4

进入“D:\test”目录,通过记事本打开生成的二进制文件“interact.dat”。你会发现除了标志外,其他的字符全部都是乱码(记事本总是以文本模式打开文件,将一个二进制写入的文件当文本读取就会解释出错,从而形成乱码);

5

关掉记事本,重新用十六机制编辑器打开“interact.dat”(比如:UltraEditor)。以16进制打开文件后,所有的数据就都可以与我们之前写入的数据对上了(分析文件格式时,离不开十六进制编辑器(就是二进制编辑器,只是数值以16进制数显示));

6

返回Python源码编辑器中,继续编写“从写入的二进制文件中读取内容”的代码(如果您对Python读取文件不熟,请参考引用内容)。这份代码中定义了一个read函数。该函数中定义了一个列表ret(用于保存读取到的数据并作为返回值返回给调用者),然后通过内建函数read,按照文件格式从文件中依次读取指定长度的数据并解析成Python数据并附加到ret中。解析读取到的字节时,用到了int.from_bytes函数并指定以little字节序解析字节流,这是因为struct默认是以little字节序打包数据的,转换时必须保持一致;

7

read函数代码编写完毕后,继续添加调用“read函数的测试代码”,确认一下之前以二进制保存的文件是否可以正常读取。如果Python自己都没法读,那么C++估计更不可能。编写完代码后,点击F5运行程序,如果能从Shell窗口见到正确的内容,则表示程序正常;

8

Python编写自定义格式二进制文件的代码已经编写并测试完毕。接下来,我们通过VS2017编写一个从Python生成的二进制文件中读取数据的测试程序。该程序主要用于确认交互的可能性,如果你不懂C++开发,看看结果就行了。

9

启动VS2017,然后新建一个名为“InteractPython”的“Windows控制台应用程序”;

10

在打开的“InteractPython.cpp”文件中,编写读取“D:\test\interact.dat”文件的代码。这份代码中,引用了iostream(提供标准输入/输出)和fstream(提供文件访问)头文件。定义了一个ifstream对象(用于读取文件)并以二进制打开目标文件。随后,调用ifstream.read()读取了3个字节的文件标志和4个字节的数据长度。接着,读取了dataLen个字节的数据并保存到已分配的缓冲区中。最后,通过std::cout输出读取到内容(16进制输出字节时,必须把数据转换成int/unsigned类型)。数据区访问结束后,通过delete释放;

11

C++读取文件的代码编写完毕后,点击工具栏上的“本地Windows调试器”调试运行程序。代码正常时,可以从控制台窗口中见到读取到的文件内容。通过核对后,可以确定文件读取成功;

12

至此,Python通过二进制文件与C++程序交互的演示过程已全部介绍完毕。下一篇,我们接着谈谈“Python中的列表排序方法”!Enjoy!

推荐信息