如何将Python'bytes'对象转换为ctypes'PININTER(c_byte)'

时间:2015-12-28 21:28:16

标签: python python-3.x ctypes

我想为具有此签名的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功能,但这不起作用。)

1 个答案:

答案 0 :(得分:0)

我刚使用POINTER(c_char)代替POINTER(c_byte),问题就消失了。