字节转换失败

时间:2015-04-29 10:04:08

标签: python python-3.x bit-manipulation

我遇到了Python &按位操作的问题:

>>> x = 0xc1
>>> y = 0x7f
>>> x & y
>>> 65
>>> bytes([65])
>>> b'A'

问题是从十进制到十六进制的转换。 650x41,但Python表示它为'A'。为什么呢?

2 个答案:

答案 0 :(得分:2)

您已拥有的值正是您想要的值。来自评论:

  

我正在使用字节函数,因为我想在最后用一个字节连接base64.b64decode(coded_string)的结果。

bytes([65])创建一个bytes对象,其中包含一个数字值为65的字节。该数字的含义取决于您如何解释字节。

repr恰好是b'A'的事实并不相关。实际值是你想要的一个字节。但repr对象的bytesthe docs解释,使用bytes文字格式以方便使用。与可打印的ASCII字符匹配的任何字节都表示为该字符,一些常见值用反斜杠转义符表示,如\n,以及其他任何内容作为十六进制转义符,都在b'…'

因此,repr(bytes([65]))b'A',因为字节65是可打印的ASCII字符A

如果您想获得一个包含数字65的十六进制表示的字符串,您可以使用hex函数 - 或者,如果您想要更好地控制格式,{{3}功能:

>>> hex(65)
'0x41'
>>> format(65, '02x')
'41'

但那不是你想要的。你想要值b'A',你已经拥有了它。

答案 1 :(得分:1)

65不是十六进制的A,它是ASCII code中的A; print(bytes([65]))print(chr(65))分别输出b'A'A(ASCII表示)。 Hexadecimal仅仅是一个以16为基础的数字系统。因此0x41是4 * 16^1 + 1 * 16^0 = 65