Ответ 1
''.join('%02x'%i for i in input)
Мне нужно создать строку шестнадцатеричных цифр из списка случайных чисел (0-255). Каждая шестнадцатеричная цифра должна быть представлена двумя символами: 5 - "05", 16 - "10" и т.д.
Пример:
Input: [0,1,2,3,127,200,255], Output: 000102037fc8ff
Мне удалось найти:
#!/usr/bin/env python
def format_me(nums):
result = ""
for i in nums:
if i <= 9:
result += "0%x" % i
else:
result += "%x" % i
return result
print format_me([0,1,2,3,127,200,255])
Однако это выглядит немного неудобно. Есть ли более простой способ?
''.join('%02x'%i for i in input)
Просто для полноты, используя современный синтаксис .format()
:
>>> numbers = [1, 15, 255]
>>> ''.join('{:02X}'.format(a) for a in numbers)
'010FFF'
>>> str(bytearray([0,1,2,3,127,200,255])).encode('hex')
'000102037fc8ff'
Еще один вариант: binascii.hexlify
:
a = [0,1,2,3,127,200,255]
print binascii.hexlify(bytes(bytearray(a)))
печатает
000102037fc8ff
Это также самая быстрая версия для больших строк на моей машине.
В Python 2.7 или выше вы можете улучшить это еще больше, используя
binascii.hexlify(memoryview(bytearray(a)))
сохранение копии, созданной вызовом bytes
.
Как и в моем другом ответе, кроме повторения строки формата:
>>> numbers = [1, 15, 255]
>>> fmt = '{:02X}' * len(numbers)
>>> fmt.format(*numbers)
'010FFF'
a = [0,1,2,3,127,200,255]
print str.join("", ("%02x" % i for i in a))
печатает
000102037fc8ff
(Также обратите внимание, что ваш код будет сбой для целых чисел в диапазоне от 10 до 15.)
С python 2.X вы можете сделать следующее:
numbers = [0, 1, 2, 3, 127, 200, 255]
print "".join(chr(i).encode('hex') for i in numbers)
Распечатать
'000102037fc8ff'
Самый последний и, на мой взгляд, предпочтительный подход - это f-string
:
''.join(f'{i:02x}' for i in [1, 15, 255])
Старый стиль формата был %
-syntax:
['%02x'%i for i in [1, 15, 255]]
Более современный подход - метод .format
:
['{:02x}'.format(i) for i in [1, 15, 255]]
Совсем недавно, начиная с версии Python 3.6 и выше, мы обращались к синтаксису f-string
:
[f'{i:02x}' for i in [1, 15, 255]]
Обратите внимание, что f'{i:02x}'
работает следующим образом.
:
это ввод или переменная для форматирования.x
означает, что строка должна быть шестнадцатеричной. Сравните f'{100:02x}'
и f'{100:02d}'
.02
указывает, что строка должна быть заполнена слева от 0
до длины 2
. Сравните f'{100:02x}'
и f'{100:30x}'
.