2012-08-31 6 views

ответ

186

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

>>> s = "Hello world !!" 
>>> ":".join("{:02x}".format(ord(c)) for c in s) 
'48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21 
+2

Отлично, он работает в python3, в то время как ответ Esthete этого не делает. –

+2

Обратите внимание, что в python3 концепция печати 'str' как hex не имеет смысла; вы захотите напечатать объект 'bytes' как hex (преобразовать' str' в 'bytes', вызвав' .encode() '). –

+5

Фактически это порождает недопустимый вывод в python3: '": ". Join (" {: 02x} ". Format (ord (c)) для c в 'løl')' возвращает ''6c: f8: 6c'' , в то время как '': ". join (" {: 02x} ". format (c) для c в 'løl'.encode())' создает правильное представление utf-8 '' 6c: c3: b8: 6c'' , –

148
':'.join(x.encode('hex') for x in 'Hello World!') 
+1

Как это сделать в python3? –

+5

@hyh: 'h = binascii.hexlify (b" Hello world !! "), чтобы получить шестую строку. b ":". join (h [i: i + 2] для i в диапазоне (0, len (h), 2)) 'для вставки' ':' 'после каждых двух шестнадцатеричных цифр в нем. – jfs

49

Для Python 2.x:

':'.join(x.encode('hex') for x in 'Hello World!') 

Кодекса выше будет не работает с Python 3.x, для 3.x, код ниже будет работать:

':'.join(hex(ord(x))[2:] for x in 'Hello World!') 
+1

также следует отметить, что позже будет ТАКЖЕ работать с python2.x И он также будет работать для символов не-ascii. – raudi

+1

. Но также обратите внимание, что последнее не заполняет начальные нули: hex (ord ("\ x00")) [2:] - «0» и «\ x00» .encode («hex») == «00» –

+2

Почему вы решили опубликовать это как новый ответ через несколько месяцев после того, как оба этих решения были предложены другими пользователями ? Если бы речь шла о том, чтобы уточнить совместимость версий, было бы разумнее предложить изменения для существующих ответов. – Air

18

Некоторые дополнения к Федор Гоголев ответ:

Во-первых, если строка содержит символы, чей «ASCII код» ниже 10, они не будут отображаться в соответствии с требованиями. В этом случае правильный формат должен быть {:02x}:

>>> s = "Hello unicode \u0005 !!" 
>>> ":".join("{0:x}".format(ord(c)) for c in s) 
'48:65:6c:6c:6f:20:75:6e:69:63:6f:64:65:20:5:20:21:21' 
             ^

>>> ":".join("{:02x}".format(ord(c)) for c in s) 
'48:65:6c:6c:6f:20:75:6e:69:63:6f:64:65:20:05:20:21:21' 
              ^^ 

Во-вторых, если «строка» в действительности является «байт строка» - и так как разница вопросов в Python 3 - вы можете предпочесть следующее :

>>> s = b"Hello bytes \x05 !!" 
>>> ":".join("{:02x}".format(c) for c in s) 
'48:65:6c:6c:6f:20:62:79:74:65:73:20:05:20:21:21' 

Пожалуйста, обратите внимание, что нет необходимости в преобразование в приведенной выше коде как a bytes objects is defined как «неизменная последовательность целых чисел в диапазоне от 0 < < = х 256».

18

Другой ответ в две строки, что некоторые из них могут найти легче читать, и помогает с перерывами отладки линии или других нечетных символов в строке:

for character in string: 
    print character, character.encode('hex') 
7

Вы можете использовать hexdump «s

import hexdump 
hexdump.dump("Hello World", sep=":") 

(добавьте .lower(), если вам нужен нижний регистр). Это работает как для Python 2 & 3.

+0

Также проблема, с которой я столкнулся, если у вас проблемы с установкой hexdump или любого другого пакета, обычно из-за настроек прокси-сервера попробуйте запустить pip с опцией прокси-сервера 'pip install -U hexdump -proxy http: //proxy.address: port' –

+0

На самом деле я допустил ошибку в использовании 'sudo' с' pip', который испортил 'pacman' ... –

7

Распечатать строку в виде шестнадцатеричных байтов?

Принятый ответ дает:

>>> s = "Hello world !!" 
>>> ":".join("{:02x}".format(ord(c)) for c in s) 
'48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21 

Принятая ответ работает только до тех пор, пока вы будете придерживаться ASCII. При использовании Юникода, например:

>>> a_string = u"Привет мир!!" # "Prevyet mir, or "Hello World" in Russian. 
>>> ":".join("{:02x}".format(ord(c)) for c in a_string) 
'41f:440:438:432:435:442:20:43c:438:440:21:21' 

Мы получаем плохой/неожиданный результат - вот кода точка, которые объединяются, чтобы сделать графемы мы видим в Юникоде, из юникода консорциума - представляющий языки все по всему миру.Это не, так как мы фактически храним эту информацию, чтобы ее могли интерпретировать другие источники.

Чтобы разрешить другим источникам использовать эти данные, нам обычно необходимо преобразовать в кодировку utf-8, например, чтобы сохранить эту строку в байтах на диске или опубликовать в html. Так что нам нужно, что кодирование для преобразования кодовых точек в кодовых блоков из UTF-8:

>>> ":".join("{:02x}".format(ord(c)) for c in a_string.encode('utf-8')) 
'd0:9f:d1:80:d0:b8:d0:b2:d0:b5:d1:82:20:d0:bc:d0:b8:d1:80:21:21' 

Или, возможно, более элегантно, просто использовать встроенную format функцию:

>>> ":".join(format(ord(c), '02x') for c in a_string.encode('utf-8')) 
'd0:9f:d1:80:d0:b8:d0:b2:d0:b5:d1:82:20:d0:bc:d0:b8:d1:80:21:21' 
4

Используя карту и лямбда-функция может получить список шестнадцатеричных значений, которые можно распечатать (или использовать для других целей)

>>> s = 'Hello 1 2 3 \x01\x02\x03 :)' 

>>> map(lambda c: hex(ord(c)), s) 
['0x48', '0x65', '0x6c', '0x6c', '0x6f', '0x20', '0x31', '0x20', '0x32', '0x20', '0x33', '0x20', '0x1', '0x2', '0x3', '0x20', '0x3a', '0x29'] 
1

Это может быть сделано в следующие способы:

from __future__ import print_function 
str = "Hello World !!" 
for char in str: 
    mm = int(char.encode('hex'), 16) 
    print(hex(mm), sep=':', end=' ') 

Выход из этого будет в шестнадцатеричном следующим образом:

0x48 0x65 0x6c 0x6c 0x6F 0x20 0x57 0x6F 0x72 0x6c 0x64 0x20 0x21 0x21

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