如何将字节缓冲区从Python传递到C

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

我正在 Python 中试验本机 C 扩展。我现在想要完成的是将字节缓冲区从 Python 传递到 C。

我需要从磁盘加载一个二进制文件并将该缓冲区传递给 C 扩展,但是我不知道应该使用什么类型。我现在拥有的是:

Python部分:

import ctypes

lib = ctypes.cdll.LoadLibrary("lib.so")

f = open("file.png", "rb")
buf = f.read()
f.close()

lib.func(buf)

C部分:

#include <stdio.h>

void func(int buf) {
    // do something with buf
}
python c
2个回答
1
投票

将二进制数据和长度传递给转储它的 C 函数的示例解决方案。

Python部分:

import ctypes

lib = ctypes.cdll.LoadLibrary("./lib.so")
f = open("file.png", "rb")
buf = f.read()
f.close()

lib.func.argtypes = [ctypes.c_void_p, ctypes.c_uint]
lib.func(ctypes.cast(buf, ctypes.c_void_p), len(buf))

C部分:

#include <stdio.h>

void func(unsigned char *buf, unsigned int len) {
    if (buf) {
        for (unsigned int i=0; i<len; i++) {
            if (i%16 == 0) {
                printf("\n");
            }
            printf("0x%02x ", buf[i]);
        }
        printf("\n");
    }
}

0
投票

替代解决方案:

import ctypes

p_data: bytes = b'\x01\x02\x03'
c_p_data_len = ctypes.c_uint(len(p_data))
c_p_data = (ctypes.c_ubyte * len(p_data))(*p_data)
dll_file = ctypes.CDLL("my_lib.dll")
result = dll_file.func(c_p_data, c_p_data_len)
© www.soinside.com 2019 - 2024. All rights reserved.