78

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

str = "ABCD"

我试图让我的输出成为

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

有没有一种简单的方法可以做到这一点?

4

9 回答 9

64

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

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])
于 2012-07-24T04:39:51.113 回答
58

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

Python2:

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

Python3:

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

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

于 2015-03-20T14:32:55.190 回答
22

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

于 2015-07-19T06:42:40.563 回答
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]

参考: http: //www.dotnetperls.com/bytes-python

于 2016-05-27T03:13:24.920 回答
6

这适用于 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

希望这可以帮助

于 2019-04-22T17:17:51.543 回答
5

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

  1. 用于encode()将字符串转换为字节,不可变
  2. 用于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')
于 2020-08-01T23:45:00.217 回答
1
s = "ABCD"
from array import array
a = array("B", s)

如果你想要十六进制:

print map(hex, a)
于 2012-07-24T04:51:48.360 回答
0

由于没有一个答案是准确的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。

于 2021-12-15T14:04:59.953 回答
-1

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

s = "ABCD"

从数组导入数组

a = array("B", s)
于 2018-12-19T15:08:09.050 回答