Python 3字节的奇怪表示法

时间:2017-01-02 04:52:07

标签: python python-3.x character-encoding byte python-3.5

有人可以确定这些bytes的符号是什么吗?乍一看,我倾向于认为“十六进制”,但我不认识xf1Ye1fl之类的内容:

b'vy\xe9\xb5\xa2\xba\xf1Y\xe8\xe1fl\x1d\x87\xacC'

当我使用some_text.encode('utf-8')对事物进行编码时,我得到了这个。

我正在尝试获取可以传递给使用Python 2的字节字符串的加密方法的字节。

1 个答案:

答案 0 :(得分:6)

你是对的 - 它是一个十六进制表示法。

在字节文字中,表示任何不能由可打印的ASCII字符(或标准转义符\n\t\r之一)表示的字节as \xNN,其中NN是字节的2位十六进制表示。

让您感到困惑的是,您误以为是错误的,例如: \xf1Y表示单个转义序列,实际上它代表两个单独的字节:

>>> len(b'\xf1Y')
2
>>> [bytes([b]) for b in b'\xf1Y']
[b'\xf1', b'Y']

如果迭代一个字节对象,你将得到字节的整数值:

>>> list(b'vy\xe9\xb5\xa2\xba\xf1Y\xe8\xe1fl\x1d\x87\xacC')
[118, 121, 233, 181, 162, 186, 241, 89, 232, 225, 102, 108, 29, 135, 172, 67]
>>> bytes([118])
b'v'
>>> bytes([121])
b'y'
>>> bytes([233])
b'\xe9'

escape sequences in Python string and bytes objects的文档提供了一些关于Python理解的转义序列的更多信息(尽管以上是它们用来表示字节对象的唯一信息)。