Python 如何将位字符串转换为ctypes字节数组?
我刚开始使用位字符串和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
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)