Строка Python 3.1.1 в шестнадцатеричном формате

Я пытаюсь использовать 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?

Ответ 1

Кодек hex был зажат в 3.x. Вместо этого используйте binascii:

>>> binascii.hexlify(b'hello')
b'68656c6c6f'

Ответ 2

У вас уже есть хорошие ответы, но я подумал, что вам может быть интересно и немного фона.

Во-первых, вам не хватает кавычек. Это должно быть:

"hello".encode("hex")

Во-вторых, этот кодек не был перенесен на Python 3.1. См. здесь. Похоже, что они еще не решили, должны ли эти кодеки быть включены в Python 3 или реализованы по-другому.

Если вы посмотрите на файл diff, прикрепленный к этой ошибке, вы можете увидеть предлагаемый метод ее реализации:

import binascii
output = binascii.b2a_hex(input)

Ответ 3

методы 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'

Надеюсь, это поможет.:)

Ответ 4

base64.b16encode и base64.b16decode конвертировать байты в и из шестнадцатеричных и работать во всех версиях Python. Подход codecs также работает, но менее прост в Python 3.

Ответ 6

В 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

Ответ 7

В Python 3 закодируйте строку в байтах и ​​используйте метод hex(), возвращая строку.

s = "hello".encode("utf-8").hex()
s
# '68656c6c6f'

Опционально преобразовать строку обратно в байты:

b = bytes(s, "utf-8")
b
# b'68656c6c6f'