84 Stimmen

Formatiere ints in einen String aus Hexadezimalzahlen

Ich muss eine Zeichenfolge aus Hexadezimalziffern aus einer Liste von zufälligen ganzen Zahlen (0-255) erstellen. Jede Hexadezimalziffer sollte durch zwei Zeichen dargestellt werden: 5 - "05", 16 - "10", usw.

Beispiel:

Eingabe: [0,1,2,3,127,200,255], 
Ausgabe: 000102037fc8ff

Ich habe es geschafft, folgendes zu erstellen:

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

Allerdings sieht das ein bisschen umständlich aus. Gibt es eine einfachere Möglichkeit?

0 Stimmen

179voto

gak Punkte 30810

Nur zur Vollständigkeit, Verwendung der modernen .format() Syntax:

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

71voto

vartec Punkte 124396
''.join('%02x'%i for i in eingabe)

4 Stimmen

Abgesehen davon, dass nur ein Code-Schnipsel ohne Erklärung vorhanden ist (schlechte SO-Praxis), bin ich mir nicht sicher, warum diese Antwort weniger Upvotes hat als die darunter. Die Verwendung der %-Syntax in Python 3 macht sie rückwärtskompatibel. Ich empfehle diese Lösung sehr, mehr als die andere.

0 Stimmen

@JoshuaDetwiler % vs format wird hier diskutiert: stackoverflow.com/questions/5082452/string-formatting-vs-for‌​mat

55voto

Roelant Punkte 3678

Der aktuellste und meiner Meinung nach bevorzugte Ansatz ist das f-string:

''.join(f'{i:02x}' for i in [1, 15, 255])

Formatierungsoptionen

Der alte Formatierungsstil war die %-Syntax:

['%02x'%i for i in [1, 15, 255]]

Der modernere Ansatz ist die .format Methode:

 ['{:02x}'.format(i) for i in [1, 15, 255]]

Vor Kurzem, ab Python 3.6 aufwärts, wurden wir mit der f-string Syntax verwöhnt:

[f'{i:02x}' for i in [1, 15, 255]]

Formatierungssyntax

Beachten Sie, dass das f'{i:02x}' folgendermaßen funktioniert.

  • Der erste Teil vor : ist der Eingang oder die Variable, die formatiert werden soll.
  • Das x zeigt an, dass der String im hex Format sein soll. f'{100:02x}' ist '64', f'{100:02d}' (dezimal) ist '100' und f'{100:02b}' (binär) ist '1100100'.
  • Das 02 zeigt an, dass der String mit 0's aufgefüllt werden soll, um eine Mindestlänge von 2 zu erreichen. f'{100:02x}' ist '64' und f'{100:30x}' ist ' 64'.

Siehe pyformat für weitere Formatierungsoptionen.

0 Stimmen

Ja, f-strings sind der beste Weg! Pyformat.info verfügt über eine umfassende Sammlung von Formatierungstricks. Obwohl es leicht veraltet ist und immer noch die .format() Methode als aktuell betrachtet, können alle dort erwähnten Tipps auch mit f-strings verwendet werden.

1 Stimmen

Mit Abstand die beste Antwort. Vollständig mit allen Formatierungsoptionen, wobei jede auf einfachste Weise integriert ist.

0 Stimmen

Leicht die beste Antwort. Der Abschnitt über pyformat ist entscheidend

39voto

John La Rooy Punkte 278961

Python 2:

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

Python 3:

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

0 Stimmen

Dies ist wahrscheinlich die leistungsstärkste Option für Python 3 im Vergleich zu den String-Formatierungsansätzen (zumindest basierend auf einigen schnellen Tests, die ich selbst durchgeführt habe; Ihre Ergebnisse können variieren).

0 Stimmen

Eine Variante, die sowohl in Python 2 als auch in Python 3 funktioniert, wäre: python import codecs ; str(codecs.encode(bytearray([0,1,2,3,127,200,255]), 'hex').decode())

18voto

Sven Marnach Punkte 525472

Ein weiteres Options ist binascii.hexlify:

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

gibt aus

000102037fc8ff

Dies ist auch die schnellste Version für große Strings auf meinem Rechner.

In Python 2.7 oder höher könnten Sie dies noch verbessern, indem Sie

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

verwenden, um die Kopie, die durch den Aufruf von bytes erstellt wird, zu speichern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X