我有一个字符串如下:
b'\x00\x00\x00\x00\x07\x80\x00\x03'
如何将其转换为字节数组? ...然后从字节返回字符串?
在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'
>>>
从字符串到字节数组:
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)
一般情况下不需要这样做。像 ASCII 表示的字符串
bytes
就是这样的一种表示。一个 bytes
对象,例如由b
字符串文字创建,已经是一个(不可变、固定大小)字节数组。
虽然字节文字和表示形式基于 ASCII 文本,但
对象实际上表现得像不可变的整数序列,序列中的每个值都受到限制,使得bytes
。0 <= x < 256
例如,可以索引一个
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
或类似内容。