2014-02-23 43 views
1

我正在使用​​与库进行接口。有一种方法需要通过一个通过char的缓冲区来填充双方的网络头/页脚,但是指针必须指向过去的预填充。传递带Ctypes的填充字符串

到目前为止,我已经做到了这一点通过执行以下操作:

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) 

但是,这感觉就像一个真正邪恶的方式来做事。

这是一个正确的方式来做到这一点?

回答

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