gpt4 book ai didi

python - 如何从 ctype 结构构建 python 字符串?

转载 作者:太空狗 更新时间:2023-10-30 01:24:12 25 4
gpt4 key购买 nike

我正在使用 ctypes 并且我已经定义了这个结构以传递参数

class my_struct(ctypes.Structure):
_fields_ = [ ("buffer", ctypes.c_char * BUFSIZE),
("size", ctypes.c_int )]

然后我使用以下代码调用 C 函数,但我不知道如何从我创建的结构创建字符串。

class Client():

def __init__(self):
self.__proto = my_struct()
self.client = ctypes.cdll.LoadLibrary(r"I:\bin\client.dll")

def version(self):
ret = self.client.execute(ctypes.byref(self.__proto))
my_string = self.__proto.buffer[:self.__proto.size]

我想使用缓冲区的前 n 个字节创建一个 python 字符串(缓冲区包含 NULL 字符,但我必须处理这种情况,并在必要时使用/0x00 字符创建字符串)。赋值

my_string = self.__proto.buffer[:self.__proto.size]

不工作因为如果出现 0x00 会截断字符串。欢迎任何想法。提前致谢。

最佳答案

你的问题是 ctypes 试图用 char 数组为你做一些魔术,自动将它们转换成以 NUL 结尾的字符串。您可以通过使用 ctypes.c_byte 类型而不是 ctypes.c_char 并使用 ctypes.string_at 检索字符串形式的值来解决这个问题.您可以使用结构类上的辅助属性更好地访问成员,例如:

import ctypes
BUFSIZE = 1024

class my_struct(ctypes.Structure):
_fields_ = [ ("_buffer", ctypes.c_byte * BUFSIZE),
("size", ctypes.c_int )]

def buffer():
def fget(self):
return ctypes.string_at(self._buffer, self.size)
def fset(self, value):
size = len(value)
if size > BUFSIZE:
raise ValueError("value %s too large for buffer",
repr(value))
self.size = size
ctypes.memmove(self._buffer, value, size)
return property(fget, fset)
buffer = buffer()

proto = my_struct()
proto.buffer = "here\0are\0some\0NULs"
print proto.buffer.replace("\0", " ")

关于python - 如何从 ctype 结构构建 python 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5082753/

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