Car*_*cho 5 c python string ctypes
我正在使用ctypes,我已经定义了这个结构来传递参数
class my_struct(ctypes.Structure):
_fields_ = [ ("buffer", ctypes.c_char * BUFSIZE),
("size", ctypes.c_int )]
Run Code Online (Sandbox Code Playgroud)
然后我使用以下代码调用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]
Run Code Online (Sandbox Code Playgroud)
我想使用缓冲区的前n个字节创建一个python字符串(缓冲区包含NULL字符,但我必须处理这种情况,如果需要,创建带有/ 0x00字符的字符串).愤怒
my_string = self.__proto.buffer[:self.__proto.size]
Run Code Online (Sandbox Code Playgroud)
如果出现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", " ")
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4680 次 |
最近记录: |