gpt4 book ai didi

python - 如何使用 ctypes 从 Python 的结构中的指针访问数据?

转载 作者:太空宇宙 更新时间:2023-11-03 13:17:23 25 4
gpt4 key购买 nike

我有以下 C 结构:

typedef struct {
uint8_t a;
uint8_t b;
uint32_t c;
uint8_t* d;
}

使用 ctypes,通过回调,我能够在 Python 中获得指向此类结构的指针,我们称它为 ref。我可以通过这种方式轻松获得 a、b、c:

from ctypes import cast, c_uint8, c_uint32, POINTER

a = cast(ref, POINTER(c_uint8)).contents.value
b = cast(ref + 1, POINTER(c_uint8)).contents.value
c = cast(ref + 2, POINTER(c_uint32)).contents.value

但我无法从 d 中读取字节。我尝试了以下方法:

d_pointer = cast(ref + 6, POINTER(POINTER(c_uint8))).contents
first_byte_of_d = d_pointer.contents
print type(first_byte_of_d) # prints <class 'ctypes.c_ubyte'>
print first_byte_of_d

在最后一行,我在使用 gdb 调试时遇到了 SIGSEGV。所以问题是,应该如何在 Python 中访问结构体指针的第一个字节?

最佳答案

您假设 c 直接跟在 b 之后,但事实并非如此。编译器将在该结构中填充几个字节(在 x86 上为 2)以对齐 c

正确的方法是在 ctypes 中声明结构的一对一映射:

from ctypes import *

class object_t(Structure):
_fields_ = [
('a', c_uint8),
('b', c_uint8),
('c', c_uint32),
('d', POINTER(c_uint8)),
]

不,您可以获得任何成员认为这种类型的值。

C 示例库:

#include <stdint.h>
#include <stdlib.h>

struct object_t {
uint8_t a;
uint8_t b;
uint32_t c;
uint8_t* d;
};

static struct object_t object = {'a', 'b', 12345, NULL};

struct object_t * func1(void)
{
return &object;
}

void func2(void(*callback)(struct object_t *))
{
callback(&object);
}

从 Python 中使用它:

from ctypes import *

class object_t(Structure):
_fields_ = [
('a', c_uint8),
('b', c_uint8),
('c', c_uint32),
('d', POINTER(c_uint8)),
]

callback_t = CFUNCTYPE(None, POINTER(object_t))

lib = CDLL('./file.dll')

func1 = lib.func1
func1.argtypes = None
func1.restype = POINTER(object_t)

func2 = lib.func2
func2.argtypes = [callback_t]
func2.restype = None

ret = func1()

a = ret.contents.a
b = ret.contents.b
c = ret.contents.c
d = ret.contents.d

def mycallback(obj):
a = obj.contents.a
b = obj.contents.b
c = obj.contents.c
d = obj.contents.d

func2(callback_t(mycallback))

关于python - 如何使用 ctypes 从 Python 的结构中的指针访问数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24912065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com