我有一个使用
在这种情况下,第三个参数是由C库分配的字节数组的指针,第四个参数是其长度。
我想通过调用
假设我的函数看起来像这样:
我的问题是:如何操纵
ctypes
向C库注册回调函数的Python库。回调函数的签名为:CFUNCTYPE(c_int_32, c_uint_32, POINTER(c_byte), POINTER(c_size_t))
在这种情况下,第三个参数是由C库分配的字节数组的指针,第四个参数是其长度。
我想通过调用
socket.recv_into
从网络中获取数据来填充字节数组。更重要的是,我想要完全填充这个字节数组:也就是说,如果recv_into
返回的字节数少于此函数的第四个参数,则我希望再次调用recv_into
。假设我的函数看起来像这样:
def callback(first, second, buffer, size):
total_read = 0
while total_read < size[0]:
total_read += some_socket.recv_into(buffer, size[0] - total_read)
# XXX: What happens here???
我的问题是:如何操纵
buffer
的值,以确保每次对recv_into
的调用都将数据附加到缓冲区中,而不是覆盖先前写入的数据?
recv_into
操作,是否有效?例如:ctypes.cast(buffer[start:end], ctypes.POINTER(ctypes.c_byte))
。缺点是您必须提供切片的结束位置,否则解释器会抱怨字符串太大。 - alexpeits