如何在Python中将字符串转换为字节数组

83

假设我有一个由4个字符组成的字符串,并且我想将这个字符串转换为字节数组,其中字符串中的每个字符都被转换为它的十六进制等效物。例如:

str = "ABCD"
我正在尝试让我的输出结果变成:
array('B', [41, 42, 43, 44])

有没有简单的方法可以实现这个?


3
抱歉,你想要的并不可行,至少不是以这种确切的形式。类型为 B 的字节数组包含1字节整数,并且它们始终以十进制表示。 - Tim Pietzcker
9个回答

68

只需使用bytearray(),它是一系列字节的列表。

Python2:

s = "ABCD"
b = bytearray()
b.extend(s)

Python3:

s = "ABCD"
b = bytearray()
b.extend(map(ord, s))

顺便提一下,不要使用 str 作为变量名,因为那是内置的。


1
@KevanAhlquist 不好意思,现在已经修复了。 - Pithikos
12
对我来说,Python 3 更加简洁: s = "ABCD", b = bytearray(), b.extend(s.encode()) - Diego Herranz
7
关于encode(),它返回一个bytes对象,该对象自然地扩展了一个bytearray。 - Diego Herranz
2
map(ord, s)会返回大于255的值,除非您的字符串严格是ASCII。请更新您的答案,包括类似s.encode('utf-8')的内容。(请注意,UTF-8是ASCII的严格超集,因此不会以任何方式更改ASCII字符串。) - 9000
2
@9000 使用.encode().encode('utf-8')是不正确的。如果您不想转换字节,请使用map(ord, ...)。https://repl.it/repls/MistySubtleVisitors只需按下“运行”即可查看结果。 - user70960
显示剩余2条评论

66

encode函数可以帮助你,在这里它返回了字符串的编码版本。

In [44]: str = "ABCD"

In [45]: [elem.encode("hex") for elem in str]
Out[45]: ['41', '42', '43', '44']

或者你可以使用array模块

In [49]: import array

In [50]: print array.array('B', "ABCD")
array('B', [65, 66, 67, 68])

然而,正如您所看到的,数组模块给出了字符串元素的ASCII值,这与您期望的输出不匹配。 - avasal
21
这是被接受的答案,但在Python3中不起作用。 你能否按照其他答案中指出的方法添加适用于Python3的版本? - Fabio Picchi

24

获取字节数组的另一种方法是将字符串编码为ascii格式:b=s.encode('ascii')


假设字符串一开始就是ASCII编码。如果你有s = '\x80',那是行不通的。 - FuriousGeorge
如果 s = '\x80',那么该怎么办? - mbrc

13

根据您的需求,这可以是一步或两步

  1. 使用encode()将字符串转换为字节,不可变
  2. 使用bytearray()将字节转换为bytearray,可变
s="ABCD"
encoded=s.encode('utf-8')
array=bytearray(encoded)

以下验证是在Python 3.7中完成的

>>> s="ABCD"
>>> encoded=s.encode('utf-8')
>>> encoded
b'ABCD'
>>> array=bytearray(encoded)
>>> array
bytearray(b'ABCD')

1
它在其他事情上帮了我。谢谢。 - ABD

10

这对我有效(Python 2)

s = "ABCD"
b = bytearray(s)

# if you print whole b, it still displays it as if its original string
print b

# but print first item from the array to see byte value
print b[0]

Reference: http://www.dotnetperls.com/bytes-python


9

这适用于Python 2和3:

>>> bytearray(b'ABCD')
bytearray(b'ABCD')

注意字符串以b开头。

要获取单个字符:

>>> print("DEC HEX ASC")
... for b in bytearray(b'ABCD'):
...     print(b, hex(b), chr(b))
DEC HEX ASC
65 0x41 A
66 0x42 B
67 0x43 C
68 0x44 D

希望这能帮到您。

1

由于没有一个答案能够完全生成array('B', [41, 42, 43, 44]),而avasal的答案在Python 3中失败了,因此我在这里发布我的替代方案:

import array
s = 'ABCD'
a = array.array('B', [ord(c) for c in s])
print(a)

打印输出

array('B', [65, 66, 67, 68])

请注意,65-68是“ABCD”的正确ASCII码。

1
s = "ABCD"
from array import array
a = array("B", s)

如果您想要十六进制:
print map(hex, a)

1
无法在repl.it中运行。返回:"TypeError:不能使用str来初始化类型码为'B'的数组"。 - MikeB2019x

-1

对于Python 3,它适用于@HYRY发布的内容。我需要它来返回dbus.array中的数据。这是唯一有效的方法。

s = "ABCD"

从数组中导入数组

a = array("B", s)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接