Подтвердить что ты не робот

Форматирование ints в строку hex

Мне нужно создать строку шестнадцатеричных цифр из списка случайных чисел (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])

Однако это выглядит немного неудобно. Есть ли более простой способ?

4b9b3361

Ответ 1

''.join('%02x'%i for i in input)

Ответ 2

Просто для полноты, используя современный синтаксис .format():

>>> numbers = [1, 15, 255]
>>> ''.join('{:02X}'.format(a) for a in numbers)
'010FFF'

Ответ 3

>>> str(bytearray([0,1,2,3,127,200,255])).encode('hex')
'000102037fc8ff'

Ответ 4

Еще один вариант: 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.

Ответ 5

Как и в моем другом ответе, кроме повторения строки формата:

>>> numbers = [1, 15, 255]
>>> fmt = '{:02X}' * len(numbers)
>>> fmt.format(*numbers)
'010FFF'

Ответ 6

a = [0,1,2,3,127,200,255]
print str.join("", ("%02x" % i for i in a))

печатает

000102037fc8ff

(Также обратите внимание, что ваш код будет сбой для целых чисел в диапазоне от 10 до 15.)

Ответ 7

С python 2.X вы можете сделать следующее:

numbers = [0, 1, 2, 3, 127, 200, 255]
print "".join(chr(i).encode('hex') for i in numbers)

Распечатать

'000102037fc8ff'

Ответ 8

Самый последний и, на мой взгляд, предпочтительный подход - это 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}'.