我刚开始接触BitString和ctypes,我已经将部分二进制文件存储在startdata
中,这是一个BitArray
类。
> print(startdata)
0x0000000109f0000000010605ffff
现在,我需要将这些数据原样传递给一个接受
unsigned char *
参数的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
ValueError: Buffer size too small (786 instead of at least 6288 bytes)
。在我的情况下,len(startdata)
是6288。你知道为什么会发生这种情况吗?我正在使用带有bytes
函数的bytearray(startdata.bytes)
。 - slhckBitArray
实例一起使用? :) 感谢你的帮助。 - slhckbyref
传递Array
是不必要的。C数组总是通过引用传递的。否则,您需要byref
来传递引用,例如对于简单类型(_SimpleCData
),指针(_Pointer
或_CFuncPtr
),结构或联合体。因此,如果代码需要通用地处理所有ctypes缓冲区,则在数组上使用byref
是可以的。 - Eryk Sununsigned char *
,而且我已经很多年没有使用C++了。 Ctypes文档说unsigned char对应于c_ubyte
。这就是为什么我选择了它。 - slhckc_char
数组和c_char_p
可能更方便。例如,c_char
数组有一个value
属性,使得赋值(字节)字符串变得容易,并且在用作结果类型或作为结构字段访问时会自动转换为(字节)字符串。 - Eryk Sun