将字节字符串转换为字节或字节数组

问题描述 投票:0回答:3

我有一个字符串如下:

  b'\x00\x00\x00\x00\x07\x80\x00\x03'

如何将其转换为字节数组? ...然后从字节返回字符串?

python byte arrays
3个回答
46
投票

在Python 3中:

>>> a=b'\x00\x00\x00\x00\x07\x80\x00\x03'
>>> b = list(a)
>>> b
[0, 0, 0, 0, 7, 128, 0, 3]
>>> c = bytes(b)
>>> c
b'\x00\x00\x00\x00\x07\x80\x00\x03'
>>>

16
投票

从字符串到字节数组:

a = bytearray.fromhex('00 00 00 00 07 80 00 03')

a = bytearray(b'\x00\x00\x00\x00\x07\x80\x00\x03')

然后回到字符串:

key = ''.join(chr(x) for x in a)

0
投票

一般情况下不需要这样做。像 ASCII 表示的字符串

bytes
就是这样的一种表示。一个
bytes
对象,例如由
b
字符串文字
创建,已经是一个(不可变、固定大小)字节数组。

虽然字节文字和表示形式基于 ASCII 文本,但

bytes
对象实际上表现得像不可变的整数序列,序列中的每个值都受到限制,使得
0 <= x < 256

-- Python 内置类型:字节对象

例如,可以索引一个

bytes
对象来获取特定的字节数据,或者迭代一个
bytes
对象来处理每个单独的字节。

如果需要可变性,

bytesarray
是合适的类型。这也支持所有可变序列方法,例如按索引分配或
.append
方法。

只需将可变字节和不可变字节传递给适当的类,就可以有效地在可变字节和不可变字节之间进行转换。例如,

bytesarray(b"\x00\x00\x07\x80\x00\x03")
bytes
文字创建可变字节数组。


请注意,

bytes
bytearray
都针对保存字节元素进行了优化。这些对象有一个实际字节数组的支持内存缓冲区,就像在类 C 语言中使用的那样。

+ <bytes> +    +-------------------
| *buffer | -> | \x00 \x03 \x00 ...
| ...     |    +-------------------
+---------+

相比之下,通用的字节容器,比如

list[int]
甚至
list[bytes]
,使用元素的完整 Python 表示。它们不是存储字节数据数组,而是存储对 Python 对象的引用序列,这些对象依次引用单个字节数据。

+ <list> ---+    +-------------------
| *elements | -> | *0   *1   *2   ...
| ...       |    +-------------------
+-----------+       /    |
                   /     |
                  v      v
        + <int> --+  + <int> --+
        | *digits |  | *digits | -> +---+
        | ...     |  | ...     |    | 1 |
        +---------+  +---------+    +---+

因此,除非绝对必要,否则应避免将

bytes
转换为
list
或类似内容。

© www.soinside.com 2019 - 2024. All rights reserved.