Python—使用ctypes向C中的函数传递imgdata指针
我一直在尝试获取一个十六进制(unicode latin-1)值的imgdata字符串,该字符串通过指向imgdata的指针从Python传递到我编写的C语言函数。C函数将这些十六进制源值(蓝绿色、红色和Alpha)转换为灰度,然后将转换后的imgdata返回dst指针地址 目前,C函数输出的源值不正确,并且与imgdata中的十六进制值相差很大。在Python中将imgdata传递给我的C函数时,有没有关于我做错了什么的建议?我的ctypes数据类型是否错误 c函数的输出: src值:120 src值:212 src值:201 src值:1 src值:0 src值:0 src值:0 src值:0 src值:0 src值:0 src值:0 src值:0 src值:0 src值:0 值应为: 4,8,20,0,1,7,12,0,6,7,14,0 Python代码:Python—使用ctypes向C中的函数传递imgdata指针,python,c,pointers,pixel,ctypes,Python,C,Pointers,Pixel,Ctypes,我一直在尝试获取一个十六进制(unicode latin-1)值的imgdata字符串,该字符串通过指向imgdata的指针从Python传递到我编写的C语言函数。C函数将这些十六进制源值(蓝绿色、红色和Alpha)转换为灰度,然后将转换后的imgdata返回dst指针地址 目前,C函数输出的源值不正确,并且与imgdata中的十六进制值相差很大。在Python中将imgdata传递给我的C函数时,有没有关于我做错了什么的建议?我的ctypes数据类型是否错误 c函数的输出: src值:120
#imgdata format is BGRA
imgdata = '\x04\x08\x14\x00\x01\x07\x0c\x00\x06\x07\x0e\x00'
testlib = ctypes.CDLL('path/to/my/lib/testlib.so')
source = (c_char_p * 12) (imgdata)
destination = (c_uint8 * 12)()
testlib.grey.argtypes = (ctypes.c_void_p, ctypes.c_void_p,ctypes.c_int)
src = pointer(source)
dst = pointer(destination)
testlib.grey(dst,src,3)
p = ctypes.string_at(dst,12)
byte_array = map(ord, p)
C代码:
#include <stdio.h>
#include <stdint.h>
void grey(uint8_t *dst, uint8_t *sc, int num_pixels) {
int k;
for (k=0; k<12; k++)
{
printf("src values: %d ", *sc++);
}
// additional BGRA to Greyscale conversion code not shown
#包括
#包括
空灰色(uint8_t*dst、uint8_t*sc、整数像素){
int k;
对于(k=0;kPython,这并不是你想要的那么难。这看起来有点:
imgdata = '\x04\x08\x14\x00\x01\x07\x0c\x00\x06\x07\x0e\x00'
testlib = ctypes.CDLL('path/to/my/lib/testlib.so')
dest = (c_uint8 * 12)()
testlib.grey(dest, imgdata, 12)
byte_array = bytearray(dest) # if you really neeed it
编辑:阅读投票人的评论(因为他删除了这些评论,所以这些评论无关紧要)。他解释了如何用你的方法纠正这些评论
哦,好吧,他坚持,这是他的密码:
imgdata = '\x04\x08\x14\x00\x01\x07\x0c\x00\x06\x07\x0e\x00'
testlib = ctypes.CDLL('path/to/my/lib/testlib.so')
dest = (ctypes.c_char * len(imgdata))()
testlib.grey.restype = None
testlib.grey.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_int]
testlib.grey(dest, imgdata, len(dest))
byte_array = bytearray(dest) # or just use dest.raw which is a python str
他的解释是:
c\u char\u p
是一个char*
数组,12个char指针是不正确的,向该数组传递指针是双重错误的,它没有在ArgumentError
中消失的唯一原因是c\u void\u p
中的argtypes
毫无怨言地接受了很多Python整数、字符串和ctypes pointers和数组。@eryksun我感谢你的评论,我真的理解你的方法是正确的。但正如你所看到的那样,这对他没有帮助。他创建了一个由12个字符指针组成的数组,然后他将指针指向已经存在的指针,最后用void*原型函数参数完成。所以我只是试图让这段代码更简单ll和clear@eryksun我同意你的方法。这对大型项目的开发至关重要。我的观点是,OP的代码中有太多错误,而他试图遵循这些错误,最好是尽可能简单地编写代码。因此,只有在这种具体情况下,我更喜欢第一个答案的版本。谢谢@qwm的更正和命令我已经测试了你上面的代码,效果非常好!@bfalz哦,那很好,因为我不能说我已经测试过了。不客气。