在 Python ctypes 中,何時(如果有的話)b'\0'在傳遞bytes給需要空終止資料的函式時需要手動添加空/零終止符?
專門針對 3 個案例(但其他人歡迎)
如果函式引數已
c_char_p通過其 argtypes宣告如果函式沒有通過 argtypes 宣告其引數
使用
memmove,如果介面期望在記憶體地址處有一個空終止字串,memmove(target, my_string.encode() b'\0', len(my_string.encode()) 1)或者你能做
memmove(target, my_string.encode(), len(my_string.encode()) 1)
背景關系:我b'\0'在sqlite-s3-query 中添加了偏執,并嘗試確定是否可以洗掉它們。如果我確實洗掉它們似乎作業正常,但我意識到可能恰好在正確的位置有空位元組,所以一切正常。我正在尋找一個更有力的保證,即空位元組是設計在那里的。
uj5u.com熱心網友回復:
至少在 CPython 中,bytes 物件的內部緩沖區始終以 null 結尾,無需添加另一個緩沖區。無論您是否指定.argtypes,生成的指標都將指向此緩沖區。
參考:https://docs.python.org/3/c-api/bytes.html#c.PyBytes_AsString:
char * PyBytes_AsString (PyObject *o)
穩定 ABI 的一部分。
回傳指向o內容的指標。指標指向 o 的內部緩沖區,由len(o) 1位元組組成。緩沖區中的最后一個位元組始終為空,無論是否有任何其他空位元組......
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/395484.html
