Python ctype help: работа с беззнаковыми указателями на C - PullRequest
5 голосов
/ 02 марта 2012

Мой первый пост, поэтому, пожалуйста, принимайте спокойно.:) Я немного новичок в Python, но мне нравится то, что я вижу до сих пор.То, что я пытаюсь сделать, это доступ к библиотеке переменного тока, которая позволяет мне печатать на принтер чеков через Python.Я создаю оболочку в Python с использованием ctypes, и все идет отлично, за исключением двух функций.Вот наши их прототипы:

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.Я должен прочитать в растровом файле в Python и передать массив в функцию записи, или в случае чтения мне нужно прочитать этот указатель в виде целочисленного массива.

Я колебался наэтот в течение последних нескольких часов, поэтому я надеялся, что эксперт сможет помочь, опубликовав простой пример того, как этого можно достичь.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 02 марта 2012

Помогает ли вам следующее?Пожалуйста, дайте мне знать, если это дает вам ошибки, или я неправильно понял ваш вопрос:

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 длины size.Затем в этой строке я вызываю функцию без аргументов, вызывая инициализацию с нулями.

4 голосов
/ 03 марта 2012

Хорошо, после помощи Кисса я смог закончить это. Вот мой тестовый код и результат для решения этой проблемы:

Мой код 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]);
    }   
}

Я создал main для тестирования моей c-функции. Вот результат теста функции:

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

Затем я скомпилировал для общего доступа, чтобы его можно было использовать из 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

Works!

Моя единственная проблема теперь связана с динамическим изменением размера массива c_ubyte в зависимости от размера вывода. Хотя я написал отдельный вопрос по этому поводу.

Спасибо за вашу помощь, Кисс!

...