Wie kann ich eine Byte-Zeichenfolge in Python in ein Int konvertieren?
Sagen Sie so: 'y\xcc\xa6\xbb'
Ich habe mir eine clevere / dumme Methode ausgedacht:
sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))
Ich weiß, dass es etwas Eingebautes oder in der Standardbibliothek geben muss, das dies einfacher macht ...
Dies unterscheidet sich von der Konvertierung einer Zeichenfolge mit Hex-Ziffern, für die Sie int (xxx, 16) verwenden können. Stattdessen möchte ich eine Zeichenfolge mit tatsächlichen Bytewerten konvertieren.
AKTUALISIEREN:
Ich mag James 'Antwort ein bisschen besser, weil es nicht erforderlich ist, ein anderes Modul zu importieren, aber Gregs Methode ist schneller:
>>> from timeit import Timer
>>> Timer('struct.unpack("<L", "y\xcc\xa6\xbb")[0]', 'import struct').timeit()
0.36242198944091797
>>> Timer("int('y\xcc\xa6\xbb'.encode('hex'), 16)").timeit()
1.1432669162750244
Meine hackige Methode:
>>> Timer("sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))").timeit()
2.8819329738616943
WEITERES UPDATE:
Jemand fragte in Kommentaren, was das Problem beim Importieren eines anderen Moduls sei. Der Import eines Moduls ist nicht unbedingt billig.
>>> Timer("""import struct\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""").timeit()
0.98822188377380371
Durch die Einbeziehung der Kosten für den Import des Moduls wird fast der gesamte Vorteil dieser Methode zunichte gemacht. Ich glaube, dass dies nur die Kosten für den einmaligen Import für den gesamten Benchmark-Lauf beinhaltet. Schauen Sie, was passiert, wenn ich es jedes Mal zum Neuladen zwinge:
>>> Timer("""reload(struct)\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""", 'import struct').timeit()
68.474128007888794
Es ist unnötig zu erwähnen, dass, wenn Sie viele Ausführungen dieser Methode pro Import durchführen, dies proportional weniger problematisch wird. Es ist wahrscheinlich auch eher E / A-Kosten als CPU, so dass es von der Kapazität und den Lasteigenschaften der jeweiligen Maschine abhängen kann.
int.from_bytes
) der mechanischen Schnecke wurde struct.unpack
auf meinem Computer übertroffen . Neben besser lesbar imo.