如何从原始(字节)ctype缓冲区构建python字符串?

2 投票
1 回答
4840 浏览
提问于 2025-04-16 12:06

我正在玩Python和ctypes,但遇到了一个问题,搞不清楚怎么解决。我调用了一个C语言的函数,它会填充一些原始的二进制数据。我的代码是这样的:

class Client():
  def __init__(self):
    self.__BUFSIZE = 1024*1024
    self.__buf = ctypes.create_string_buffer(self.__BUFSIZE)
    self.client = ctypes.cdll.LoadLibrary(r"I:\bin\client.dll")


  def do_something(self):
    len_written = self.client.fill_raw_buffer(self.__buf, self.__BUFSIZE)
    my_string = repr(self.__buf.value)
    print my_string

问题是我收到的二进制数据中有0x00这个字节,而当我尝试构建my_string的时候,这些数据被截断了。如果self._buf里面包含了0x00,我该怎么构建my_string呢?

欢迎任何建议。谢谢!

1 个回答

8

你可以通过使用 create_string_buffer() 返回的缓冲区的 raw 属性,将其当作 Python 字符串来访问:

a = ctypes.create_string_buffer(10)
a.raw 
# '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

如果你只想访问前 n 个字节,可以使用:

a.raw[:n]

撰写回答