网站首页 文章专栏 ctypes中使用c_char_p接收数据被截断
ctypes中使用c_char_p接收数据被截断
创建于:2018-09-26 16:00:00 更新于:2024-11-25 16:29:14 羽瀚尘 2488
python python,ctypes

背景

使用windriver开发基于python的项目时,发现读取数据 总是被截断,比如明明应该返回\x7e\x7f\x7d\x00\x66,在python中仅输出\x7e\x7f\x7d。前前后后 调试了很久也没有明显破绽,很是头疼。

错误定位

这种错误是比较难调试的,因为涉及到python,dll,windriver三者,无从知道到底是哪一方出了问题。当然, 使用bus hound进行了数据抓取后,可以确定usb device是没有问题的。

于是就开始看文档,直到在文档中发现c_char_p char * (NUL terminated),再看我的代码

buffer = ctypes.c_char_p()
buffer.value = b'\xFF' * 512

受c/c++编程思想影响较重,仍然采取用ff对数组初始化,取数组指针用来传参的方式。

至此,错误已经很清晰了,是由于ctypes中的c_char_p为字符指针, 碰到'\x00'就会被截断。

修复

但修复的过程也没有那么简单,本来使用c_char_p就是一种蹩脚的替代方案,现在连替代方案都没有了。 还是看文档吧。

很快,还是在文档中找到了Arrays一节。具体的用法是这样的:

  1. 定义一个类 buffer_class = c_ubyte * 512
  2. 初始化这个类 buffer = buffer_class()
  3. 读这个类print(buffer[0])

主要还是卡在了初始化这个类上,当时并没有碰到过这种用法,也是挺神奇,动态地生成一个类。

至此,bug修复。