2015-04-01 38 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