Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—使用ctypes向C中的函数传递imgdata指针_Python_C_Pointers_Pixel_Ctypes - Fatal编程技术网

Python—使用ctypes向C中的函数传递imgdata指针

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

我一直在尝试获取一个十六进制(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代码:

#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哦,那很好,因为我不能说我已经测试过了。不客气。