Python ctype: 当c函数向c函数写入值时,向c函数写入的char数组没有得到更新。

问题描述 投票:0回答:1

这是我的C代码。

//int MyFunc(char* res); -> This is the definition of C function
char data[4096];  
MyFunc(data);
printf("Data is : %s\n", data);

这是我的C代码: data 变量由C函数更新。我使用了 bytearray 在Python中传递变量作为参数,但更新后的数组没有反映出来。任何工作的代码示例都非常感激。

EDIT: 我使用的是Python 3.7.My Python代码。

data = bytearray(b'1234567890')
str_buffer = create_string_buffer(bytes(data), len(data))
print(MyFunc(str_buffer))
print(str_buffer.value) #Output: b''

str_buffer 不包含更新的值 MyFunc().打电话 MyFunc() 使用下面的签名,从C#中提取出的代码对我来说是可行的。我正在寻找一个与之相当的Python 3.7版本。

[DllImport("mydll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int MyFunc(StringBuilder data);
python c python-3.x python-3.7 ctypes
1个回答
2
投票

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'
© www.soinside.com 2019 - 2024. All rights reserved.