用Ctypes传递带衬垫的字符串

时间:2014-02-23 00:28:01

标签: python ctypes

我正在使用ctypes与库进行交互。有一种方法需要在两侧填充传递的char缓冲区以写入网络页眉/页脚,指针必须指向过去预填充。

到目前为止,我通过以下方式完成了这项工作:

send_buffer = b'\0' * 18 + payload + b'\0' * 4
ptr = ctypes.cast (send_buffer, ctypes.c_void_p)
ptr.value += 18
lws.libwebsocket_write (wsi, ptr, len (payload), 0)

但这感觉就像是一种非常邪恶的做事方式。

这是正确的方式吗?

1 个答案:

答案 0 :(得分:2)

cast正在返回Python字符串的内部指针。不要将不可变的Python字符串传递给需要可变缓冲区的函数。使用create_string_buffer创建可变char数组(阅读16.17.1.4. Fundamental data types部分)。对于偏移量,请将byref与可选的offset参数一起使用:

send_buf = ctypes.create_string_buffer(b'\0' * 18 + payload + b'\0' * 4)
lws.libwebsocket_write(wsi, ctypes.byref(send_buf, 18), len(payload), 0)

send_buf.value # null terminated
send_buf.raw   # complete array