web-dev-qa-db-fra.com

Formater les entrées en chaîne d'hex

J'ai besoin de créer une chaîne de chiffres hexadécimaux à partir d'une liste d'entiers aléatoires (0-255). Chaque chiffre hexadécimal doit être représenté par deux caractères: 5 - "05", 16 - "10", etc.

Exemple:

Input: [0,1,2,3,127,200,255], 
Output: 000102037fc8ff

J'ai réussi à trouver:

#!/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])

Cependant, cela semble un peu gênant. Y a-t-il un moyen plus simple?

38
facha
''.join('%02x'%i for i in input)
46
vartec

Juste pour être complet, en utilisant la syntaxe moderne .format():

>>> numbers = [1, 15, 255]
>>> ''.join('{:02X}'.format(a) for a in numbers)
'010FFF'
90
Gerald Kaszuba
>>> str(bytearray([0,1,2,3,127,200,255])).encode('hex')
'000102037fc8ff'
31
John La Rooy

Une autre option est binascii.hexlify:

a = [0,1,2,3,127,200,255]
print binascii.hexlify(bytes(bytearray(a)))

empreintes

000102037fc8ff

C'est aussi la version la plus rapide pour les grandes chaînes sur ma machine.

En Python 2.7 ou supérieur, vous pouvez améliorer cela encore davantage en utilisant

binascii.hexlify(memoryview(bytearray(a)))

enregistrer la copie créée par l'appel bytes.

13
Sven Marnach

Semblable à mon autre réponse, à l'exception de la répétition de la chaîne de format:

>>> numbers = [1, 15, 255]
>>> fmt = '{:02X}' * len(numbers)
>>> fmt.format(*numbers)
'010FFF'
9
Gerald Kaszuba
a = [0,1,2,3,127,200,255]
print str.join("", ("%02x" % i for i in a))

empreintes

000102037fc8ff

(Notez également que votre code échouera pour les entiers compris entre 10 et 15.)

3
Sven Marnach

Avec Python 2.X, vous pouvez effectuer les opérations suivantes:

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

impression

'000102037fc8ff'
0
selfboot