Печатать строку как шестнадцатеричные байты?

У меня есть эта строка: Hello world !! и я хочу напечатать его с помощью Python как 48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21 .

hex() работает только для целых чисел.

Как это можно сделать?

9 Solutions collect form web for “Печатать строку как шестнадцатеричные байты?”

Вы можете преобразовать строку в генератор 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 
 ':'.join(x.encode('hex') for x in 'Hello World!') 

Для 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!') 

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

Во-первых, если строка содержит символы, «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' 

Обратите внимание, что в приведенном выше коде нет необходимости в преобразовании, поскольку объекты байтов определяются как «неизменяемая последовательность целых чисел в диапазоне 0 <= x <256» .

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

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

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

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

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

Печатать строку как шестнадцатеричные байты?

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

 >>> 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. Если вы используете unicode, например:

 >>> 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' 

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

 >>> 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'] 

Это можно сделать следующим образом:

 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

  • Лучший способ разделить шестнадцатеричный в python?
  • Python, печать Hex удаляет первые 0?
  • Python - лучший язык программирования в мире.