Ich habe Daten in einem Byte-Array gespeichert. Wie kann ich diese Daten in eine Hex-Zeichenfolge konvertieren?
Beispiel für mein Byte-Array:
array_alpha = [ 133, 53, 234, 241 ]
python
string
python-2.7
bytearray
Jamie Wright
quelle
quelle
Antworten:
Verwenden von
str.format
:>>> array_alpha = [ 133, 53, 234, 241 ] >>> print ''.join('{:02x}'.format(x) for x in array_alpha) 8535eaf1
oder mit
format
>>> print ''.join(format(x, '02x') for x in array_alpha) 8535eaf1
oder
bytearray
mitbinascii.hexlify
:>>> import binascii >>> binascii.hexlify(bytearray(array_alpha)) '8535eaf1'
Hier ist ein Benchmark der oben genannten Methoden in Python 3.6.1:
from timeit import timeit import binascii number = 10000 def using_str_format() -> str: return "".join("{:02x}".format(x) for x in test_obj) def using_format() -> str: return "".join(format(x, "02x") for x in test_obj) def using_hexlify() -> str: return binascii.hexlify(bytearray(test_obj)).decode('ascii') def do_test(): print("Testing with {}-byte {}:".format(len(test_obj), test_obj.__class__.__name__)) if using_str_format() != using_format() != using_hexlify(): raise RuntimeError("Results are not the same") print("Using str.format -> " + str(timeit(using_str_format, number=number))) print("Using format -> " + str(timeit(using_format, number=number))) print("Using binascii.hexlify -> " + str(timeit(using_hexlify, number=number))) test_obj = bytes([i for i in range(255)]) do_test() test_obj = bytearray([i for i in range(255)]) do_test()
Ergebnis:
Methoden
format
zusätzliche Formatierungsoptionen liefern, wie zB Trennung von Zahlen mit Leerzeichen" ".join
, Kommas", ".join
, Großbuchstaben Druck"{:02X}".format(x)
/format(x, "02X")
, etc., aber zu einem Preis von großen Auswirkungen auf die Leistung.quelle
b'8535eaf1'
auf meinem System, was istb
?bytes
Objekte zurück.return bytes objects
- Byte Objekt bedeutet? so etwas wie einint
Objekt?Built-in Types - Bytes
.b'8535eaf1'.decode()
Betrachten Sie die hex () -Methode des
bytes
Typs unter Python 3.5 und höher:>>> array_alpha = [ 133, 53, 234, 241 ] >>> print(bytes(array_alpha).hex()) 8535eaf1
EDIT: Es ist auch viel schneller als
hexlify
(modifizierte @ falsetru Benchmarks oben)from timeit import timeit N = 10000 print("bytearray + hexlify ->", timeit( 'binascii.hexlify(data).decode("ascii")', setup='import binascii; data = bytearray(range(255))', number=N, )) print("byte + hex ->", timeit( 'data.hex()', setup='data = bytes(range(255))', number=N, ))
Ergebnis:
bytearray + hexlify -> 0.011218150997592602 byte + hex -> 0.005952142993919551
quelle
hex_string = "".join("%02x" % b for b in array_alpha)
quelle
Wenn Sie ein Numpy-Array haben, können Sie Folgendes tun:
>>> import numpy as np >>> a = np.array([133, 53, 234, 241]) >>> a.astype(np.uint8).data.hex() '8535eaf1'
quelle
bytearray([133, 53, 234, 241]).hex()
Oder wenn Sie ein Fan von funktionaler Programmierung sind:
>>> a = [133, 53, 234, 241] >>> "".join(map(lambda b: format(b, "02x"), a)) 8535eaf1 >>>
quelle