Python 如何将位字符串转换为ctypes字节数组?

Python 如何将位字符串转换为ctypes字节数组?,python,c++,ctypes,bitstring,Python,C++,Ctypes,Bitstring,我刚开始使用位字符串和ctypes,我有一部分二进制文件存储在类startdata中 现在,我必须按原样将此数据传递给一个C函数,该函数以无符号字符*为参数,因此我首先尝试这样做: buf = (c_ubyte * len(startdata))() 要最终做到这一点: buf_ptr = cast(pointer(buf), POINTER(c_ubyte)) 这是可行的,但是如何将startdata中的字节数据分配给刚刚创建的数组/缓冲区 这不起作用: > buf = (c_uby

我刚开始使用位字符串和ctypes,我有一部分二进制文件存储在类
startdata

现在,我必须按原样将此数据传递给一个C函数,该函数以
无符号字符*
为参数,因此我首先尝试这样做:

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

下面是一个可能的解决方案(请注意,我使用的是python 3):

(注意:这同样适用于将
字节
实例转换为ctypes字节数组,只需删除
数据.bytes
中的
.bytes

然后,您可以使用以下命令将缓冲区传递给C函数:


当我这样做时,它会说:
ValueError:buffersize太小(786而不是至少6288字节)
。在我的例子中,
len(startdata)
是6288。你知道为什么会这样吗?我正在将
bytearray(startdata.bytes)
与函数一起使用。@slhck:正确的行应该是这样的:
buffer=(ctypes.c_uint8*len(startdata.bytes))。from_buffer(bytearray(startdata.bytes))
,在这个上下文中给定
startdata
位数组的一个实例。确保你得到了正确物体的长度。这非常有效!如果您可以编辑答案中的这些部分,使它们能够与
位数组
实例一起工作:)谢谢你的帮助。我不知道为什么OP需要
c_ubyte
数组而不是
c_char
数组。对于后者,您可以使用
buffer=create\u string\u buffer(data.bytes)
。这会附加一个终止的空字节,这是库所期望的。否则使用
b=data.bytes
buffer=(c_ubyte*len(b))。从_buffer\u copy(b)
。我忘了添加使用
byref
传递
数组
是不必要的。C数组总是通过引用传递。您确实需要
byref
以传递引用,否则,即传递到简单类型(
\u SimpleCData
)、指针(
\u pointer
\u CFuncPtr
)、结构或联合。因此,如果代码需要一般性地处理所有ctypes缓冲区,那么在数组上使用
byref
就可以了。
> buf = (c_ubyte * len(startdata))(*startdata.bytes)
TypeError: an integer is required
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
byref(buffer)