2015-04-29 70 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',你已經有了。