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修復。