2012-08-23 22 views
0

蟒蛇的ctypes投得空字符串蟒蛇ctypes的投得到空字符串

b是地址

如果b_v.value是一種常見的字符,這是正常的。 但如果b的內容是十六進制,如‘1122001314’只要它包含十六進制‘00’ 結果也許是1122 001314應該是失去

現在我想要得到的所有內容‘1122001314’。請給我一些方法,謝謝。

代碼:

b_v=ctypes.cast(b,ctypes.POINTER(ctypes.c_char_p)) 

print binascii.b2a_hex(b_v.value) 

例如:

import ctypes 
import binascii 

va=binascii.a2b_hex('1212273031003535') 
tt=ctypes.create_string_buffer(va) 
b=ctypes.addressof(tt) 
b_v=ctypes.cast(b,ctypes.c_char_p) 
print binascii.b2a_hex(b_v.value) 

現在的結果是:"1212273031"

我要的結果是"1212273031003535"

+1

Weclome到#1。請嘗試改進您的問題的措辭,或者提供一個具體的代碼示例來說明您想要的內容(輸入和預期輸出)。很難理解你的問題。 –

+0

示例代碼已互補 – w32c

回答

2

tt=ctypes.create_string_buffer(va)你是行從hexa構建一個string_buffer數據的二進制表示(二進制數據),它是錯誤的,因爲c字符串以第一個0值字符結束。所以你的數據中斷了。 幸運的是,ctypes除了字符串值之外還提供原始數據,所以tt.raw可以訪問原始數據,您可以使用binascii.b2a_hex(tt.raw),但我不確定它對您有沒有用。

如果你想運行b=ctypes.addressof(tt)和地址傳遞到別處,然後通過b_v=ctypes.cast(b,ctypes.c_char_p)檢索地址數據,我應該說,因爲你的數據不是文本這是不可能的string_buffer類型,它是一個二進制數據,你可以」把它存儲在一個string_buffer中,然後用它的地址訪問它。

您可以檢索知道B如果你知道數據的長度太數據,試試這個:

b, l = ctypes.addressof(tt), len(tt) - 1 # l - 1, because there is one extra byte for terminator NULL 

#Somewhere else: 
b_v=ctypes.cast(b, ctypes.POINTER(ctypes.c_char * l)) 
print binascii.b2a_hex(b_v.contents) 
+0

binascii.b2a_hex(tt.raw)很有用,但只能通過b獲取內容 – w32c

+0

b_v = ctypes.cast(b,ctypes.c_char_p)並且可以更改此行 – w32c

+0

您可以使用b ,當且僅當你知道數據的長度,我已經給我的答案添加了一個例子 – MostafaR