我有一個問題,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