Wie kann ich ein Byte-Array (wie in Java mit Byte []) in Python darstellen? Ich muss es mit gevent über den Draht schicken.
byte key[] = {0x13, 0x00, 0x00, 0x00, 0x08, 0x00};
Antworten:
In Python 3 verwenden wir das bytes
Objekt, auch str
in Python 2 bekannt.
# Python 3
key = bytes([0x13, 0x00, 0x00, 0x00, 0x08, 0x00])
# Python 2
key = ''.join(chr(x) for x in [0x13, 0x00, 0x00, 0x00, 0x08, 0x00])
Ich finde es bequemer, das base64
Modul zu benutzen ...
# Python 3
key = base64.b16decode(b'130000000800')
# Python 2
key = base64.b16decode('130000000800')
Sie können auch Literale verwenden ...
# Python 3
key = b'\x13\0\0\0\x08\0'
# Python 2
key = '\x13\0\0\0\x08\0'
Verwenden Sie einfach a bytearray
(Python 2.6 und höher), das eine veränderbare Folge von Bytes darstellt
>>> key = bytearray([0x13, 0x00, 0x00, 0x00, 0x08, 0x00])
>>> key
bytearray(b'\x13\x00\x00\x00\x08\x00')
Durch die Indizierung werden die einzelnen Bytes abgerufen und festgelegt
>>> key[0]
19
>>> key[1]=0xff
>>> key
bytearray(b'\x13\xff\x00\x00\x08\x00')
und wenn Sie es als str
(oder bytes
in Python 3) benötigen , ist es so einfach wie
>>> bytes(key)
'\x13\xff\x00\x00\x08\x00'
fubar = str(key); print(len(key), len(fubar))
produziert 6 38
. In jedem Fall (1) ist "string" eine sehr vage Terminologie (2), wenn er Veränderlichkeit will, kann er seine ursprüngliche Liste
str
anders bytearray
in Python 3 zu arbeiten - behoben. Ich erwähnte die Veränderlichkeit hauptsächlich, um sie von zu unterscheiden bytes
, aber der Punkt ist auch, dass Sie keinen Zwischenschritt benötigen, um Ihre Daten überhaupt in einem list
zu haben.
struct.pack("<IH", 19, 8)
...
Eine Alternative, die auch den zusätzlichen Vorteil hat, dass die Ausgabe einfach protokolliert werden kann:
hexs = "13 00 00 00 08 00"
logging.debug(hexs)
key = bytearray.fromhex(hexs)
ermöglicht es Ihnen, einfache Substitutionen wie folgt vorzunehmen:
hexs = "13 00 00 00 08 {:02X}".format(someByte)
logging.debug(hexs)
key = bytearray.fromhex(hexs)
Dietrichs Antwort ist wahrscheinlich genau das, was Sie für das, was Sie beschreiben, benötigen: Senden von Bytes, aber ein näheres Analogon zu dem Code, den Sie beispielsweise angegeben haben, wäre die Verwendung des bytearray
Typs.
>>> key = bytearray([0x13, 0x00, 0x00, 0x00, 0x08, 0x00])
>>> bytes(key)
b'\x13\x00\x00\x00\x08\x00'
>>>
bytearray
ist wirklich der richtige Weg, wenn Sie ein Byte-Array möchten.
bytearray('b', ...)
nicht funktioniert. Oder Sie können es einfach löschen.
base64.b16decode(x)
einfach verwendenx.decode("hex")
. Damit kommen Sie zumindest mit einem Import weniger aus. :)