如何从CTYPE结构构建Python字符串?[英] How do I build a python string from a ctype struct?

本文是小编为大家收集整理的关于如何从CTYPE结构构建Python字符串?的处理方法,想解了如何从CTYPE结构构建Python字符串?的问题怎么解决?如何从CTYPE结构构建Python字符串?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在使用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字符串(缓冲区包含空字符,但我必须处理这种情况并使用/0x00字符的字符串(如果必要)创建). asignation

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", " ")

其他推荐答案

我认为您需要将指针发送到My_struct中的C字符串,而不是直接的C字符串,因为C字符串是无效的.尝试这样做:

import ctypes

BUFSIZE = 10

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

cstr = (ctypes.c_char * BUFSIZE)()
proto = my_struct(cstr)

本文地址:https://www.itbaoku.cn/post/359100.html