如果您确实想要一份副本,您可以使用bytearray
:
>>> buff = (c_ubyte * 4)(*[97,98,99,100])
>>> bs = bytearray(buff)
>>> bs
bytearray(b'abcd')
>>> str(bs)
'abcd'
编辑:
对于缺少 2.6 之前的 Python 版本bytearray
,您可以改用以下方法之一:
cast(buff, c_char_p).value
buffer(buff)[:]
如果要共享同一个缓冲区,可以创建一个c_char
数组:
>>> buff2 = (c_char * len(buff)).from_buffer(buff)
>>> buff2.value # string copy
'abcd'
>>> buff2[:] = 'efgh'
>>> buff[:] # modified original
[101, 102, 103, 104]
编辑:
from_buffer
类方法是在 2.6 中添加的。在以前的版本中,您可以使用cast
:
buff2 = cast(buff, POINTER(c_char * len(buff)))[0]
您是否有理由不使用c_char
数组开始?我了解您是否需要将它作为数字数组和字符串来使用。
附录:
第二种方法更像是“强制转换”,因为它不复制缓冲区。使用第一种方法,它会被复制两次,一次是制作 the bytearray
,一次是制作str
(bytes
是str
2.x 中的别名)。但是 abytearray
有字符串方法,可能就是你所需要的;它基本上是 3.x 的可变版本bytes
。
c_char
是Cchar
型。乘以一个数组,它是一个可变的字节缓冲区,就像您当前的c_ubyte
数组一样。但是,它可能比c_ubyte
它具有返回 Python 字节字符串的value
和描述符更方便。raw
它还将索引和迭代作为单个字符字节字符串而不是整数。
如果函数将修改它,您不应该做的是c_char_p
从 Python 字符串创建一个 - 指向字符数据的指针。Python 字符串对象是不可变的;如果你修改他们的缓冲区,你会得到奇怪的错误。我最近回答了一个关于该主题的问题。