2015-04-29 2 views
-1

У меня есть проблема с операцией & побитового Пайтона:преобразования байт сбой

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

Проблема заключается в преобразовании десятичных чисел в шестнадцатеричном формате. 65 - 0x41, однако Python говорит, что это 'A'. Зачем?

+2

Почему вы используете 'bytes', если хотите' hex'? 'hex (65) == '0x41'' ... Также обратите внимание, что ваша проблема ** совсем не ** с оператором' & ', который дает ожидаемый результат (' 65'). – jonrsharpe

+0

bytes() преобразуется в ascii. используйте hex(), как указано выше. – cbz

+0

Вы хотите просто напечатать шестнадцатеричное значение? – thefourtheye

ответ

1

65 не A в гексагоне, это A в ASCII code; print(bytes([65])) и print(chr(65)) выходы b'A' и A, соответственно (ASCII-представления). Hexadecimal - всего лишь система цифр с 16 в качестве основы. 0x41 есть поэтому 4 * 16^1 + 1 * 16^0 = 65.

+1

Это, очевидно, вопрос Python 3, иначе 'bytes ([65])' будет ''[65]'', а не 'b'A'', поэтому этот ответ на Python 2 вводит в заблуждение. – abarnert

+0

@abarnert: Обновлен ответ для соответствия python> = 3. – EvenLisle

2

Значение, которое у вас уже есть, - это именно то значение, которое вы хотите. От комментария:

Я использовал функцию байтов, потому что хочу конкатцировать результат base64.b64decode (coded_string) с еще одним байтом в конце.

bytes([65]) создает bytes объект с помощью одного байта с числовым значением 65. То, что означает это число, зависит от того, как вы интерпретируете байты.

Дело в том, что его reprb'A' не имеет отношения к делу. Фактически это значение - это тот, который вы хотите. Но repr объекта bytes, как объясняет the docs, использует формальный формат bytes для удобства. Любые байты, который соответствует печати ASCII символов получают представлены в виде этот символа, несколько общих значений получить представлены обратный слеш как \n, и все остальное, как шестигранная побег, все в пределах b'…'

Итак, repr(bytes([65])) является b'A', потому что байты 65 является печатным символом ASCII A.


Если вы хотите, чтобы получить строку с шестнадцатеричным представлением числа 65, вы можете использовать hex функция или, если вы хотите иметь больший контроль над форматированием, в format функции:

>>> hex(65) 
'0x41' 
>>> format(65, '02x') 
'41' 

Но это не то, что вы хотите здесь. Вы хотите значение b'A', и у вас уже есть это.

Смежные вопросы