如何将字符串转换为字节数组?

21

我如何将字符串转换为其字节值?我有一个字符串"hello",我想将其更改为类似于"/x68..."的东西。


2
你意识到在最底层,一切都只是位和字节,而字符串"hello""\x68\x65\x6C\x6C\x6F"是相同的(除非你转义反斜杠而不是将它们用于十六进制转义)? - user395760
1
这没任何意义,你实际上想做什么?(这只是你认为需要执行的某些中间步骤) - plundra
7
你究竟想做什么?值得注意的是,Python 中的 str 类型基本上只是一组字节(这意味着它没有像 Unicode 这样的表示形式,可以是任意序列的字节,尽管它的名称是字符串)。 - mipadi
4
如果你正在使用Python 3,需要加上一句话:str是Unicode编码。如果要将它转换为字节,可以使用s.encode()(也可以指定所需的字符编码,否则默认为UTF-8)。 - Thomas K
3
对于那些想知道为什么要这样做的人:我发现这对于解析使用 pySerial 读取的二进制数据非常有用。 - kjgregory
显示剩余6条评论
3个回答

33

Python 2.6及更高版本具有bytearray类型,可能是您要查找的内容。与字符串不同,它是可变的,即您可以 "就地" 改变单个字节,而不必创建整个新字符串。它具有列表和字符串功能的优点。并且它还清楚地表明您正在处理任意字节而不是文本。


1
我想将文件中的所有内容(字符串)更改为字节数组。@kindall的答案正是这样做的。+1 for bytearray() - easysid
10
list(bytearray("hello")) - Trevor Rudolph
5
我进行了一些速度测试,list(bytearray("hello"))map(ord, "hello") 更快。 - Trevor Rudolph
不将其转换为列表(而是将其保留为“bytearray”)通常甚至更快! - kindall

28

也许你需要这个(Python 2):

>>> map(ord,'hello')
[104, 101, 108, 108, 111]
对于一个 Unicode 字符串,这将返回 Unicode 代码点:
>>> map(ord,u'Hello, 马克')
[72, 101, 108, 108, 111, 44, 32, 39532, 20811]

但要对它进行编码以获得该编码的字节值:

>>> map(ord,u'Hello, 马克'.encode('chinese'))
[72, 101, 108, 108, 111, 44, 32, 194, 237, 191, 203]
>>> map(ord,u'Hello, 马克'.encode('utf8'))
[72, 101, 108, 108, 111, 44, 32, 233, 169, 172, 229, 133, 139]

请注意,对于非ASCII字符,此代码不会返回“byte”值,因为ord函数将返回大于0xFF的值。 - user100464
@user100464,不适用于字节字符串,上述代码适用于Python 2(在Python 3中map不返回一个列表)。 一个字节无法超过0xFF。 此外,非ASCII码的值高于0x7F,而不是0xFF :) - Mark Tolonen

14

如果您想要获取十六进制字符串表示,可以这样做:

"hello".encode("hex") # '68656c6c6f'

为了符合您的参考表示(不要太认真,我猜这并不是您真正想要的):

"".join(["/x%02x" % ord(c) for c in "hello"]) # '/x68/x65/x6c/x6c/x6f'

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