Ответ 1
Кодек hex
был зажат в 3.x. Вместо этого используйте binascii
:
>>> binascii.hexlify(b'hello')
b'68656c6c6f'
Я пытаюсь использовать str.encode()
, но я получаю
>>> "hello".encode(hex)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be string, not builtin_function_or_method
Я пробовал кучу вариаций, и они, кажется, все работают в Python 2.5.2, поэтому что мне нужно сделать, чтобы заставить их работать в Python 3.1?
Кодек hex
был зажат в 3.x. Вместо этого используйте binascii
:
>>> binascii.hexlify(b'hello')
b'68656c6c6f'
У вас уже есть хорошие ответы, но я подумал, что вам может быть интересно и немного фона.
Во-первых, вам не хватает кавычек. Это должно быть:
"hello".encode("hex")
Во-вторых, этот кодек не был перенесен на Python 3.1. См. здесь. Похоже, что они еще не решили, должны ли эти кодеки быть включены в Python 3 или реализованы по-другому.
Если вы посмотрите на файл diff, прикрепленный к этой ошибке, вы можете увидеть предлагаемый метод ее реализации:
import binascii
output = binascii.b2a_hex(input)
методы binascii проще, тем более
>>> import binascii
>>> x=b'test'
>>> x=binascii.hexlify(x)
>>> x
b'74657374'
>>> y=str(x,'ascii')
>>> y
'74657374'
>>> x=binascii.unhexlify(x)
>>> x
b'test'
>>> y=str(x,'ascii')
>>> y
'test'
Надеюсь, это поможет.:)
base64.b16encode
и base64.b16decode
конвертировать байты в и из шестнадцатеричных и работать во всех версиях Python. Подход codecs также работает, но менее прост в Python 3.
Использовать hexlify - http://epydoc.sourceforge.net/stdlib/binascii-module.html
В Python 3 все строки являются unicode. Обычно, если вы кодируете объект unicode в строку, вы используете .encode('TEXT_ENCODING')
, так как hex
не является текстовой кодировкой, вы должны использовать codecs.encode()
для обработки произвольных кодеков. Например:
>>>> "hello".encode('hex')
LookupError: 'hex' is not a text encoding; use codecs.encode() to handle arbitrary codecs
>>>> import codecs
>>>> codecs.encode(b"hello", 'hex')
b'68656c6c6f'
Опять же, поскольку "привет" является юникодом, вам нужно указать его как строку байта перед кодировкой в шестнадцатеричный. Это может быть более подробно с вашим оригинальным подходом к использованию метода encode
.
Различия между binascii.hexlify
и codecs.encode
заключаются в следующем:
binascii.hexlify
Шестнадцатеричное представление двоичных данных.
Возвращаемое значение является байтовым объектом.
Тип: builtin_function_or_method
codecs.encode
encode (obj, [encoding [, errors]]) → object
Кодирует obj с использованием кодека, зарегистрированного для кодирования. кодирование по умолчанию к кодировке по умолчанию. ошибки могут быть заданы для установки другой ошибки схема обработки. Значение по умолчанию является "строгим", что означает, что ошибки кодирования повышаются ValueError. Другими возможными значениями являются "игнорировать", "заменять" и 'xmlcharrefreplace', а также любое другое имя, зарегистрированное в codecs.register_error, который может обрабатывать ValueErrors.
Тип: builtin_function_or_method
В Python 3 закодируйте строку в байтах и используйте метод hex()
, возвращая строку.
s = "hello".encode("utf-8").hex()
s
# '68656c6c6f'
Опционально преобразовать строку обратно в байты:
b = bytes(s, "utf-8")
b
# b'68656c6c6f'