网站首页 文章专栏 ctypes中使用c_char_p接收数据被截断
在使用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
一节。具体的用法是这样的:
buffer_class = c_ubyte * 512
buffer = buffer_class()
print(buffer[0])
主要还是卡在了初始化这个类上,当时并没有碰到过这种用法,也是挺神奇,动态地生成一个类。
至此,bug修复。