如何将 Python 'bytes' 对象转换为 ctypes 'POINTER(c_byte)'
How to convert a Python 'bytes' object to ctypes 'POINTER(c_byte)'
我想用这个签名为 C 函数编写一个 ctypes 包装器:
int utp_process_udp(utp_context *ctx, const byte *buf, size_t len, const struct sockaddr *to, socklen_t tolen);
为了进行一些类型检查,我已将其添加到我的 Python 包装器中:
libutp.utp_process_udp.argtypes = [POINTER(UtpContext), POINTER(c_byte), c_size_t, POINTER(sockaddr_in), c_int]
但是当我将 bytes
对象作为 buf
参数传递时,我得到了这个错误:
Traceback (most recent call last):
File "ucat.py", line 269, in <module>
main()
File "ucat.py", line 251, in main
network_loop()
File "ucat.py", line 138, in network_loop
utp.utp_process_udp(ctx, data, addr)
File "/home/mostafa/source/pyutp/utp.py", line 159, in utp_process_udp
POINTER(c_byte)(data), c_size_t(len(data)),
TypeError: expected c_byte instead of bytes
如果我不设置 argtypes
我可以成功调用函数,所以显然 bytes
对象 可以 传递给这个函数。我应该做些什么让 ctypes 知道我在做什么?也许是某种演员? (我 已经 尝试使用 ctypes.cast
函数,但是没有用。)
我只是使用 POINTER(c_char)
而不是 POINTER(c_byte)
,问题就消失了。
我想用这个签名为 C 函数编写一个 ctypes 包装器:
int utp_process_udp(utp_context *ctx, const byte *buf, size_t len, const struct sockaddr *to, socklen_t tolen);
为了进行一些类型检查,我已将其添加到我的 Python 包装器中:
libutp.utp_process_udp.argtypes = [POINTER(UtpContext), POINTER(c_byte), c_size_t, POINTER(sockaddr_in), c_int]
但是当我将 bytes
对象作为 buf
参数传递时,我得到了这个错误:
Traceback (most recent call last):
File "ucat.py", line 269, in <module>
main()
File "ucat.py", line 251, in main
network_loop()
File "ucat.py", line 138, in network_loop
utp.utp_process_udp(ctx, data, addr)
File "/home/mostafa/source/pyutp/utp.py", line 159, in utp_process_udp
POINTER(c_byte)(data), c_size_t(len(data)),
TypeError: expected c_byte instead of bytes
如果我不设置 argtypes
我可以成功调用函数,所以显然 bytes
对象 可以 传递给这个函数。我应该做些什么让 ctypes 知道我在做什么?也许是某种演员? (我 已经 尝试使用 ctypes.cast
函数,但是没有用。)
我只是使用 POINTER(c_char)
而不是 POINTER(c_byte)
,问题就消失了。