我遇到了Python &
按位操作的问题:
>>> x = 0xc1
>>> y = 0x7f
>>> x & y
>>> 65
>>> bytes([65])
>>> b'A'
问题是从十进制到十六进制的转换。 65
为0x41
,但Python表示它为'A'
。为什么呢?
答案 0 :(得分:2)
您已拥有的值正是您想要的值。来自评论:
我正在使用字节函数,因为我想在最后用一个字节连接base64.b64decode(coded_string)的结果。
bytes([65])
创建一个bytes
对象,其中包含一个数字值为65
的字节。该数字的含义取决于您如何解释字节。
其repr
恰好是b'A'
的事实并不相关。实际值是你想要的一个字节。但repr
对象的bytes
,the 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
。