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
一節。具體的用法是這樣的:
- 定義一個類
buffer_class = c_ubyte * 512
- 初始化這個類
buffer = buffer_class()
- 讀這個類
print(buffer[0])
主要還是卡在了初始化這個類上,當時並沒有碰到過這種用法,也是挺神奇,動態地生成一個類。
至此,bug修復。