Python ctype help:使用C unsigned char指针

时间:2012-03-02 17:11:32

标签: python arrays pointers bitmap ctypes

我的第一篇文章所以请轻松一下。 :)我对Python也有点新意,但我喜欢到目前为止看到的内容。我要做的是访问一个允许我通过Python打印到收据打印机的c库。我正在使用ctypes在Python中创建一个包装器,一切都很好,除了两个函数。在这里我们的原型:

int C56_api_printer_write(int printer, unsigned char * data, int size, unsigned long timeout_ms);
int C56_api_printer_read(int printer, unsigned char * data, int size, unsigned long timeout_ms);

我的问题是使用ctypes写入和读取unsigned char指针。我必须在Python中读取位图文件并将数组传递给write函数,或者在读取的情况下,我需要将该指针作为整数数组读取。

过去几个小时我一直在讨论这个问题,所以我希望专家可以通过发布一个如何实现这一目标的简单例子来提供帮助。

谢谢!

2 个答案:

答案 0 :(得分:5)

以下内容对您有帮助吗?如果它给你错误或我误解了你的问题,请告诉我:

size =
printer =
timeout =

data = (ctypes.c_ubyte * size)() # line 5

C56_api_printer_read(printer, data, size, timeout)

# manipulate data eg
data[3] = 7

C56_api_printer_write(printer, data, size, timeout)

编辑:

关于第5行:另见http://docs.python.org/library/ctypes.html第15.17.1.13和15.17.1.20节。

(ctypes.c_ubyte * size)

给出一个构造长度大小的ctypes数组的函数。然后在这一行中,我调用没有参数的函数,导致初始化为零。

答案 1 :(得分:4)

好的,在Kyss的帮助下我完成了这个。这是我的测试代码和完成此问题的结果:

我的test.c代码:

#include <stdio.h>
int test(unsigned char *test, int size){
    int i;
    for(i=0;i<size;i++){
        printf("item %d in test = %d\n",i, test[i]);
    }   
}
int testout(unsigned char *test, int *size){
   test[2]=237;
   test[3]=12;
   test[4]=222;
   *size = 5;
}
main () {
    test("hello", 5); 
    unsigned char hello[] = "hi";
    int size=0;
    int i;
    testout(hello,&size);
    for(i=0;i<size;i++){
        printf("item %d in hello = %d\n",i, hello[i]);
    }   
}

我创建了一个用于测试我的c函数的main。这是功能测试的输出:

item 0 in test = 104
item 1 in test = 101
item 2 in test = 108
item 3 in test = 108
item 4 in test = 111
item 0 in hello = 104
item 1 in hello = 105
item 2 in hello = 237
item 3 in hello = 12
item 4 in hello = 222

然后我编译为shared,所以它可以在python中使用:

gcc -shared -o test.so test.c

这就是我用于python代码的内容:

from ctypes import *

lib = "test.so"
dll = cdll.LoadLibrary(lib)
testfunc = dll.test
print "Testing pointer input"
size = c_int(5)
param1 = (c_byte * 5)()
param1[3] = 235 
dll.test(param1, size)
print "Testing pointer output"
dll.testout.argtypes = [POINTER(c_ubyte), POINTER(c_int)]
sizeout = c_int(0)
mem = (c_ubyte * 20)() 
dll.testout(mem, byref(sizeout))
print "Sizeout = " + str(sizeout.value)
for i in range(0,sizeout.value):
    print "Item " + str(i) + " = " + str(mem[i])

输出:

Testing pointer input
item 0 in test = 0
item 1 in test = 0
item 2 in test = 0
item 3 in test = 235
item 4 in test = 0
Testing pointer output
Sizeout = 5
Item 0 = 0
Item 1 = 0
Item 2 = 237
Item 3 = 12
Item 4 = 222

作品!

我现在唯一的问题是根据输出的大小动态调整c_ubyte数组的大小。不过,我已经发布了一个单独的问题。

感谢您的帮助Kyss!