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

How to convert string to byte array in Python

提问人:AndroidDev 提问时间:7/24/2012 最后编辑:Mark RotteveelAndroidDev 更新时间:12/15/2021 访问量:378266

问:

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

str = "ABCD"

我试图让我的输出成为

array('B', [41, 42, 43, 44])

有没有一种直接的方法可以做到这一点?

评论

3赞 Tim Pietzcker 7/24/2012
你想要的是不可能的,至少不是以这种确切的形式。类型的字节数组包含 1 字节整数,它们始终以十进制表示。B

答:

66赞 avasal 7/24/2012 #1

encode 函数可以帮到你,encode 返回一个编码版本的字符串

In [44]: str = "ABCD"

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

或者你可以使用阵列模块

In [49]: import array

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

评论

0赞 avasal 7/24/2012
但是,正如您所看到的,Array 模块给出了字符串元素的 ASCII 值,这与预期的输出不匹配
21赞 Fabio Picchi 10/24/2018
这是公认的答案,在 Python3 中不起作用。您能否添加其他答案中指出的 python3 版本?
1赞 HYRY 7/24/2012 #2
s = "ABCD"
from array import array
a = array("B", s)

如果你想要十六进制:

print map(hex, a)

评论

1赞 MikeB2019x 3/12/2020
在 repl.it 中不起作用。返回: “TypeError: cannot use a str to initialize a array with typecode 'B' ”
68赞 Pithikos 3/20/2015 #3

只需使用一个字节列表即可。bytearray()

蟒蛇2:

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

蟒蛇3:

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

顺便说一句,不要用作变量名称,因为它是内置的。str

评论

1赞 Pithikos 4/13/2015
@KevanAhlquist我的错。现在修复了它。
12赞 Diego Herranz 6/16/2016
对于 Python 3,这对我来说看起来更干净:, ,s = "ABCD"b = bytearray()b.extend(s.encode())
7赞 Diego Herranz 6/16/2016
关于 encode(),它返回一个 bytes 对象,该对象自然地扩展了 bytearray。
2赞 9000 2/15/2018
map(ord, s)将返回 255 >值,除非您的字符串严格为 ASCII。请更新您的答案,以包含类似 .(请注意,UTF-8 是 ASCII 的严格超集,因此它不会以任何方式更改 ASCII 字符串。s.encode('utf-8')
2赞 user70960 3/18/2020
@9000使用和.如果您不希望转换字节,请使用。repl.it/repls/MistySubtleVisitors 只需按下即可查看结果。.encode().encode('utf-8')map(ord, ...)run
24赞 Jon Perryman 7/19/2015 #4

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

评论

0赞 FuriousGeorge 7/31/2021
假设字符串一开始就是 ASCII。如果你有 s = '\x80',那是行不通的。
0赞 mbrc 9/14/2021
如果 s = '\x80' 该怎么办?
10赞 mgear 5/27/2016 #5

这对我有用(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]

编号: http://www.dotnetperls.com/bytes-python

-1赞 July Marval 12/19/2018 #6

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

s = "ABCD"

从数组导入数组

a = array("B", s)
9赞 juliocesar 4/23/2019 #7

这在 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

希望这会有所帮助

13赞 oldpride 8/2/2020 #8

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

  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 8/23/2022
它在其他事情上帮助了我。谢谢
1赞 user171780 12/15/2021 #9

由于没有一个答案准确产生,并且 avasal 的答案在 Python 3 中失败,因此我在这里发布我的替代方案:array('B', [41, 42, 43, 44])

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。