У меня есть эта строка: Hello world !!
и я хочу напечатать ее, используя Python как48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21
.
hex()
работает только для целых чисел.
Как это можно сделать?
python
string
hex
ordinal-indicator
Эдуард Флоринеску
источник
источник
str
или Python 3bytestring
), поскольку нет однозначного преобразования символа в целое число в 0 ... 255. Таким образом, строки символов (Python 2unicode
и Python 3str
) сначала требуют некоторой кодировки, прежде чем они будут преобразованы в этот шестнадцатеричный формат. Ответ Аарона Холла иллюстрирует это.Ответы:
Вы можете преобразовать вашу строку в генератор int, применить шестнадцатеричное форматирование для каждого элемента и вставить его в разделитель:
источник
str
виде гекса не имеет смысла; Вы хотите напечататьbytes
объект как шестнадцатеричный (преобразоватьstr
вbytes
вызов.encode()
).":".join("{:02x}".format(ord(c)) for c in 'løl')
возвращается'6c:f8:6c'
, в то время как":".join("{:02x}".format(c) for c in 'løl'.encode())
дает правильное представление UTF-8'6c:c3:b8:6c'
.":".join("{:04x}".format(ord(c)) for c in s)
(заменяющий02x
с04x
к нулевой площадке каждому номера из 4 цифр) вместоWARNING: Calling str(pkt) on Python 3 makes no sense!
источник
h = binascii.hexlify(b"Hello world !!") to get hex string. b":".join(h[i:i+2] for i in range(0, len(h), 2))
вставлять':'
после каждых двух шестнадцатеричных цифр в нем.LookupError: 'hex' is not a text encoding; use codecs.encode() to handle arbitrary codecs
Для Python 2.x:
Код выше не будет работать с Python 3.x , для 3.x код ниже будет работать:
источник
Другой ответ в две строки, который некоторым может показаться более легким для чтения, помогает при отладке разрывов строк или других нечетных символов в строке:
Для Python 2.7
Для Python 3.7 (не тестируется на всех выпусках 3)
источник
codecs.encode(<bytestring>, "hex")
работает, хотя.import sys
;s="Déjà vu Besançon,Lupiñén,Šiauliai,Großräschen,Łódź,Аша,广东省,LA"
;for c in s:
;w=sys.stdout.write(c+":"+c.encode('utf-8').hex()+"||")
; (ушел)D:44||é:c3a9||j:6a||à:c3a0|| :20||v:76||u:75|| :20||B:42||e:65||s:73||a:61||n:6e||ç:c3a7||o:6f||n:6e||,:2c||L:4c||u:75||p:70||i:69||ñ:c3b1||é:c3a9||n:6e||,:2c||Š:c5a0||i:69||a:61||u:75||l:6c||i:69||a:61||i:69||,:2c||G:47||r:72||o:6f||ß:c39f||r:72||ä:c3a4||s:73||c:63||h:68||e:65||n:6e||,:2c||Ł:c581||ó:c3b3||d:64||ź:c5ba||,:2c||А:d090||ш:d188||а:d0b0||,:2c||广:e5b9bf||东:e4b89c||省:e79c81||,:2c||L:4c||A:41||
Некоторые дополнения к ответу Федора Гоголева:
Во-первых, если строка содержит символы, чей «код ASCII» меньше 10, они не будут отображаться, как требуется. В этом случае правильный формат должен быть
{:02x}
:Во-вторых, если ваша «строка» на самом деле является «байтовой строкой» - и поскольку различие имеет значение в Python 3 - вы можете предпочесть следующее:
Обратите внимание, что в приведенном выше коде нет необходимости в преобразовании, поскольку объекты байтов определены как «неизменяемая последовательность целых чисел в диапазоне 0 <= x <256» .
источник
Принятый ответ дает:
возвращает:
Принятый ответ работает только до тех пор, пока вы используете байты (в основном символы ascii). Но если вы используете Unicode, например:
Вам нужно как-то преобразовать в байты.
Если ваш терминал не принимает эти символы, вы можете декодировать из UTF-8 или использовать имена (чтобы вы могли вставить и запустить код вместе со мной):
Итак, мы видим, что:
возвращается
плохой / неожиданный результат - это те кодовые точки, которые объединяются для создания графем, которые мы видим в Unicode, от Консорциума Unicode - представляющих языки во всем мире. Это не то, как мы на самом деле храним эту информацию, поэтому она может быть интерпретирована другими источниками.
Чтобы позволить другому источнику использовать эти данные, нам обычно необходимо преобразовать кодировку в UTF-8, например, чтобы сохранить эту строку в байтах на диск или опубликовать в html. Поэтому нам нужно, чтобы кодирование для преобразования кодовых точек в кодовые единицы UTF-8 - в Python 3
ord
не требуется, посколькуbytes
являются итерациями целых чисел:Или, возможно, более элегантно, используя новые f-строки (доступно только в Python 3):
В Python 2 перейдите
c
кord
первому, т. Е.ord(c)
- больше примеров:источник
Вы можете использовать
hexdump
«S(добавьте,
.lower()
если вам требуется строчные буквы). Это работает как для Python 2 и 3.источник
pip install -U hexdump --proxy http://proxy.address:port
sudo
сpip
, что испортилоpacman
...С помощью функции map и lambda можно получить список шестнадцатеричных значений, которые можно распечатать (или использовать для других целей).
источник
[hex(ord(c)) for c in s]
Это можно сделать следующими способами:
Вывод этого будет в шестнадцатеричном виде следующим образом:
источник
__future__
- это стандартная библиотека, доступная в последних версиях Python 2, которую можно использовать для создания функций, обычно только в Python 3 с обратной совместимостью. В этом ответе он используется для полученияprint(text)
функции «функция печати», которая заменяетprint text
синтаксис из Python 2. См. Документы по Python .Немного более общий для тех, кто не заботится о Python3 или двоеточиях:
источник
Использование
base64.b16encode
в python2 (его встроенный)источник
.decode()
?Просто для удобства, очень просто.
источник
для чего-то, что предлагает большую производительность, чем
''.format()
, вы можете использовать это:извините, это не выглядело
бы лучше, было бы неплохо, если бы можно было просто сделать
'%02x'%v
, но это занимает только int ...но вы застряли с байтовыми строками
b''
без логики для выбораord(v)
.источник