2015-04-01 42 views
3

我剛剛開始使用BitString和ctypes,並且我有一個二進制文件的一部分存儲在startdata,BitArray類中。現在如何將BitString轉換爲ctypes字節數組?

> print(startdata) 
0x0000000109f0000000010605ffff 

,我要通過這個數據,是一個C函數,它接受一個unsigned char *作爲參數,所以我第一次嘗試做這樣的事情:

buf = (c_ubyte * len(startdata))() 

終於做到這一點:

buf_ptr = cast(pointer(buf), POINTER(c_ubyte)) 

這工作,但如何從startdata字節數據分配給我創造了這個數組/緩衝?

這不起作用:

> buf = (c_ubyte * len(startdata))(*startdata.bytes) 
TypeError: an integer is required 

回答

2

這裏是一個可能的解決方案(請注意,我使用python 3):

import ctypes 

def bitarray_to_ctypes_byte_buffer(data): 
    """Convert a BitArray instance to a ctypes array instance""" 
    ba = bytearray(data.bytes) 
    ba_len = len(ba) 
    buffer = (ctypes.c_uint8 * ba_len).from_buffer(ba) 
    return buffer 

(注:同一申請轉換bytes實例到一個ctypes字節數組,只需在data.bytes中刪除.bytes)。

然後,您可以通過使用byref緩衝區傳遞到您的C函數:

byref(buffer) 
+0

當我做到這一點,它說:'ValueError異常:緩衝區太小(786,而不是至少6288個字節)'。在我的例子中,'len(startdata)'是6288.你知道這是爲什麼嗎?我正在使用'bytearray(startdata.bytes)'和['bytes'](https://pythonhosted.org/bitstring/constbitarray.html#bitstring.Bits.bytes)函數。 – slhck 2015-04-01 14:32:08

+0

@slhck:正確的行應該是這樣的:'buffer =(ctypes.c_uint8 * len(startdata.bytes))。from_buffer(bytearray(startdata.bytes))',這裏給出'startdata'是一個實例'BitArray'。確保你得到了正確的對象的長度。 – Neitsa 2015-04-01 14:44:19

+0

完美運作!也許如果你可以在你的答案中編輯這些部分,以便它們與'BitArray'實例一起工作? :) 謝謝你的幫助。 – slhck 2015-04-01 14:52:10