Ctypes 在缓冲区中的偏移量

2 投票
1 回答
2525 浏览
提问于 2025-04-16 02:59

我有一个字符串缓冲区:b = create_string_buffer(numb),其中numb是字节数。

在我的包装器中,我需要对这个缓冲区进行切片。当我调用一个需要POINTER(c_char)的函数时,我可以这样做:myfunction(self, byref(b, offset)),但是在一个结构体中:

 class mystruct(Structure):
    _fields_ = [("buf", POINTER(c_char))]

我无法这样做,会出现参数类型异常。所以我的问题是:我该如何将.buf设置为b的一个偏移量。直接赋值是可以的,像这样.buf = b,但这并不合适。(因为Python在每秒创建大约32,000个这样的缓冲区时表现不佳,所以我想使用一个单一的切片缓冲区。)

1 个回答

3

ctypes.cast 是一个用于在 Python 中处理 C 语言数据的工具。简单来说,它可以把一种数据类型转换成另一种类型。想象一下,你有一个盒子,里面装的是一种玩具,但你想把它换成另一种玩具。这个工具就像是一个魔法师,可以帮你把盒子里的玩具换成你想要的那种。

使用这个工具时,你需要告诉它你想要转换成什么类型,就像告诉魔法师你想要什么样的玩具。这样,它就能帮你完成这个转换。

在编程中,数据类型的转换是很常见的事情,尤其是在处理底层的 C 语言数据时,ctypes.cast 就显得特别有用。

>>> import ctypes
>>> b = ctypes.create_string_buffer(500)
>>> b[:6] = 'foobar'
>>> ctypes.cast(ctypes.byref(b, 4), ctypes.POINTER(ctypes.c_char))
<ctypes.LP_c_char object at 0x100756e60>
>>> _.contents
c_char('a')

撰写回答