A bytearray
- неправильный способ передачи char *
в C функцию. Вместо этого используйте create_string_buffer
. Кроме того, len(data)
является ошибкой, которая приводит к отсутствию нулевого терминатора, поэтому либо добавьте + 1
к этому, либо удалите его, так как длина по умолчанию верна. Вот минимальный рабочий пример. Во-первых, функция C, которая переводит каждую букву в верхний регистр и возвращает количество букв, которые уже были прописными:
#include <ctype.h>
int MyFunc(char* res) {
int i = 0;
while(*res) {
if(isupper(*res)) {
++i;
} else {
*res = toupper(*res);
}
++res;
}
return i;
}
Я скомпилировал ее с помощью gcc -fPIC -shared upstring.c -o upstring.so
. Поскольку вы находитесь на Windows, вам придется адаптировать это.
Теперь некоторые Python, которые его называют:
from ctypes import *
upstring = CDLL("./upstring.so") # Since you're on Windows, you'll have to adapt this too.
data = bytearray(b'abc12DEFGHI')
str_buffer = create_string_buffer(bytes(data)) # Note: using len(data) would be an off-by-one error that would lose the null terminator, so either omit it or use len(data)+1
print(upstring.MyFunc(str_buffer)) # prints 6
print(str_buffer.value) # prints b'ABC12DEFGHI'