Python 3.1.1 строка в гекс - PullRequest
       15

Python 3.1.1 строка в гекс

56 голосов
/ 26 февраля 2010

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

Ответы [ 9 ]

75 голосов
/ 26 февраля 2010

Кодек hex был исправлен в 3.x. Используйте binascii вместо:

>>> binascii.hexlify(b'hello')
b'68656c6c6f'
21 голосов
/ 26 февраля 2010

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

Во-первых, вы упускаете цитаты. Должно быть:

"hello".encode("hex")

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

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

import binascii
output = binascii.b2a_hex(input)
18 голосов
/ 25 ноября 2012

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

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

11 голосов
/ 13 июня 2017

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

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

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

b = bytes(s, "utf-8")
b
# b'68656c6c6f'
7 голосов
/ 02 сентября 2015

В Python 3 все строки в юникоде. Обычно, если вы кодируете объект 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

    Шестнадцатеричное представление двоичных данных.

    Возвращаемое значение является байтовым объектом.

    Тип: встроенная_функция_метод

  • codecs.encode

    кодировать (объект, [кодирование [, ошибки]]) -> объект

    Кодирует obj, используя кодек, зарегистрированный для кодирования. кодировка по умолчанию в кодировку по умолчанию. ошибки могут быть даны, чтобы установить другую ошибку Схема обработки. По умолчанию это «строгий», что означает, что ошибки кодирования повышаются Ошибка ValueEr. Другими возможными значениями являются «игнорировать», «заменить» и 'xmlcharrefreplace', а также любое другое имя, зарегистрированное в codecs.register_error, который может обрабатывать ValueErrors.

    Тип: встроенный_функция_метод

6 голосов
/ 20 декабря 2013

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

3 голосов
/ 18 февраля 2019

Самый простой способ сделать это в Python 3.x:

>>> 'halo'.encode().hex()
'68616c6f'

Если вы вручную вводите строку в интерпретатор Python , используя символы utf-8, вы можете сделать это еще быстрее, набрав b перед строкой:

>>> b'halo'.hex()
'68616c6f'

Эквивалент в Python 2.x:

>>> 'halo'.encode('hex')
'68616c6f'
3 голосов
/ 26 февраля 2010
1 голос
/ 12 февраля 2018

Еще один метод:

s = 'hello'

h = ''.join([hex(ord(i)) for i in s]);

# outputs: '0x680x650x6c0x6c0x6f'

Это в основном разбивает строку на символы, выполняет преобразование через hex(ord(char)) и объединяет символы обратно вместе. Если вам нужен результат без префикса 0x, выполните:

h = ''.join([str(hex(ord(i)))[2:4] for i in s]);

# outputs: '68656c6c6f'

Протестировано с Python 3.5.3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...