我有一个问题,Python的&
位运算:字节转换失败
>>> x = 0xc1
>>> y = 0x7f
>>> x & y
>>> 65
>>> bytes([65])
>>> b'A'
的问题是从十进制到十六进制的转换。 65
是0x41
,但是Python说它是'A'
。为什么?
我有一个问题,Python的&
位运算:字节转换失败
>>> x = 0xc1
>>> y = 0x7f
>>> x & y
>>> 65
>>> bytes([65])
>>> b'A'
的问题是从十进制到十六进制的转换。 65
是0x41
,但是Python说它是'A'
。为什么?
65不是十六进制中的A,而是中的A; print(bytes([65]))
和print(chr(65))
分别输出b'A'
和A
(ASCII表示)。 Hexadecimal只是一个以16为基数的数字系统。 0x41因此是4 * 16^1 + 1 * 16^0 = 65
。
您已拥有的价值正是您想要的价值。从一个评论:
我使用字节功能,因为我想在最后多一个字节concar结果base64.b64decode(coded_string)。
bytes([65])
创建与数值65
一个字节一个bytes
对象。这个数字的含义取决于你如何解释字节。
它的repr
碰巧与b'A'
不相关。实际值是什么,是你想要的一个字节。但是bytes
对象的repr
,如the docs所解释的,为了方便,使用了文字格式。匹配的任何一个可打印的ASCII字符字节被表示为字符,一些共同的价值观得到与反斜杠表示转义像\n
,和其他任何为十六进制转义,内b'…'
所以所有,repr(bytes([65]))
是b'A'
,因为字节65
是可打印的ASCII字符A
。
如果你想用数字65
的十六进制表示的字符串,你可以使用hex
功能,或者,如果你想要更多控制权的格式,在format
功能:
>>> hex(65)
'0x41'
>>> format(65, '02x')
'41'
但这不是你想要的。你想要的价值b'A'
,你已经有了。
你为什么在'hex'使用'bytes'? 'hex(65)=='0x41'' ...另外,请注意,你的问题根本不是**,而是使用'&'运算符,它提供了预期的结果('65')。 – jonrsharpe
bytes()将转换为ascii。使用十六进制()如上。 – cbz
你只是想打印十六进制值吗? – thefourtheye