【发布时间】:2020-11-12 19:37:33
【问题描述】:
在C 中,我有一个函数需要unsigned chars 的数组
void writedata(unsigned char *datapos, int datanum)
我想从 Python 传递一个标准字符串
writedata = parallel.writedata
writedata.argtypes = [POINTER(c_ubyte), c_int]
a = "test string"
writedata(a, 11)
据我了解,字符串实际上是一个字节/字符数组,a 是一个指针。但是,ctypes 不同意:
ctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: expected LP_c_ubyte instance instead of str
如何从字符串中获取“真实”指针?
编辑:David Cullen 提供了一个以字符串指针为参数的解决方案:
writedata.argtypes = [c_char_p, c_int]
这很好,但我想为函数提供 byte arrays 和 strings。这意味着这也应该有效
ll = [0,1,2,3,4,5,6,7]
uints = (c_ubyte*8)(*ll)
writedata(uints, 8)
我很好奇为什么我不能两者都做,因为在内存方面我认为字节数组和字符串应该是一样的?也许这都是关于指针转换的?
我还尝试将两个ctypes 连接到同一个C 函数,但这不起作用。
解决方案:我重新提出了问题并在此处获得了最佳答案:
【问题讨论】:
-
我想你可能会发现这个问题很有用:click me
-
@IkarusDeveloper 必须是
ctypes。我已经编写了一个巨大的程序,所有其他PythonC通信由ctypes完成 -
“据我所知,字符串实际上是一个字节/字符数组” - C 字符串是,但不是 Python 字符串。 Python 字符串是 Unicode 代码点的抽象序列,它可能有多种不同的内存表示。
-
@user2357112supports Monica Fair 论点。如果我知道只有 ASCII 字符,或者如果我把
b放在前面,即b"test string",该怎么办? -
@Pygmalion:将
b放在前面使其成为bytes,而不是str,所以它应该可以工作。