gpt4 book ai didi

python-2.7 - 将 ctype 字节数组转换为字节

转载 作者:行者123 更新时间:2023-12-04 03:16:10 24 4
gpt4 key购买 nike

我有一个像这样定义的 ctypes 数组:

buff= (c_ubyte*buff_size)()

用数据填充缓冲区后,我需要以字节格式获取这些数据。现在我这样做如下:
buff= [n for n in buff]
buff = ''.join(map(chr, buff))

这样做的问题是它在将其转换回单字节字符串之前将其转换为 4 字节(或任何字节数)的 int,这会浪费大量 CPU。

如何将 ctypes 缓冲区直接转换为字节?我不想为自己保存一份副本,因为无论如何我都必须做一份副本,因为我无法保留原始缓冲区。 python 有这种东西的强制转换功能吗?

谢谢。

最佳答案

如果你确实想要一份副本,你可以使用 bytearray :

>>> buff = (c_ubyte * 4)(*[97,98,99,100])
>>> bs = bytearray(buff)
>>> bs
bytearray(b'abcd')
>>> str(bs)
'abcd'

Edit:

For Python versions prior to 2.6 that lack bytearray, you can use one of the following instead:

  • 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]

Edit:

The from_buffer class method was added in 2.6. In prior versions you can use cast:

  • buff2 = cast(buff, POINTER(c_char * len(buff)))[0]


您是否有理由不使用 c_char数组开始?我知道您是否需要将它作为数字数组和字符串使用。

附录:

第二种方法更像是“强制转换”,因为它不复制缓冲区。使用第一种方法,它被复制了两次,一次是为了制作 bytearray并再次制作 str ( bytes 是 2.x 中 str 的别名)。但是一个 bytearray有字符串方法,可能就是你所需要的;它基本上是 3.x bytes 的可变版本.
c_char是 C char类型。乘以一个数组,它是一个可变的字节缓冲区,就像您当前的 c_ubyte大批。不过可能比 c_ubyte方便多了因为它有 valueraw返回 Python 字节字符串的描述符。它还作为单字符字节字符串而不是整数进行索引和迭代。

你不应该做的是创建一个 c_char_p -- 指向字符数据的指针 -- 如果函数将修改它,则来自 Python 字符串。 Python 字符串对象是不可变的;如果你修改他们的缓冲区,你会得到奇怪的错误。我最近 answered a question关于那个话题。

关于python-2.7 - 将 ctype 字节数组转换为字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15377338/

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