2015-04-29 29 views
-1

我有一个问题,Python的&位运算:字节转换失败

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

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

+2

你为什么在'hex'使用'bytes'? 'hex(65)=='0x41'' ...另外,请注意,你的问题根本不是**,而是使用'&'运算符,它提供了预期的结果('65')。 – jonrsharpe

+0

bytes()将转换为ascii。使用十六进制()如上。 – cbz

+0

你只是想打印十六进制值吗? – thefourtheye

回答

1

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

+1

这很明显是一个Python 3的问题 - 否则'字节([65])''是''''而不是'b'A'' - 所以这个Python 2特定的答案是误导性的。 – abarnert

+0

@abarnert:更新了符合python> = 3的答案。 – EvenLisle

2

您已拥有的价值正是您想要的价值。从一个评论:

我使用字节功能,因为我想在最后多一个字节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',你已经有了。