前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ctypes中使用c_char_p接收数据被截断

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

作者头像
羽翰尘
修改2019-11-26 17:01:23
2.8K1
修改2019-11-26 17:01:23
举报
文章被收录于专栏:技术向技术向

本文由腾讯云+社区自动同步,原文地址 https://cloud.tencent.com/developer/article/1540891

背景

在使用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修复。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 错误定位
  • 修复
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档