ctypes中使用c_char_p接收数据被截断

  • 2019 年 11 月 20 日
  • 筆記

背景

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

错误定位

这种错误是比较难调试的,因为涉及到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修复。

Exit mobile version