Byte-Array in Python


79

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:


81

In Python 3 verwenden wir das bytesObjekt, auch strin 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 base64Modul 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'

9
Für die Aufzeichnung können Sie stattdessen base64.b16decode(x)einfach verwenden x.decode("hex"). Damit kommen Sie zumindest mit einem Import weniger aus. :)
— Dolda2000

32

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 bytesin Python 3) benötigen , ist es so einfach wie

>>> bytes(key)
'\x13\xff\x00\x00\x08\x00'

Nicht so einfach mit 3.x; 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
— John Machin

@ John: Guter Punkt, um stranders bytearrayin 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 listzu haben.
— Scott Griffiths

2
Es ist eine faire Chance, dass das OP wirklich so etwas wie struct.pack("<IH", 19, 8)...
— John Machin

6

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)

3

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 bytearrayTyps.

>>> key = bytearray([0x13, 0x00, 0x00, 0x00, 0x08, 0x00])
>>> bytes(key)
b'\x13\x00\x00\x00\x08\x00'
>>> 

1
Gut für Python 2.5 oder früher, aber das eingebaute bytearrayist wirklich der richtige Weg, wenn Sie ein Byte-Array möchten.
— Scott Griffiths

@TokenMacGuy: Ihre Antwort muss noch 2 Mal bearbeitet werden: (1) erwähnt, dass das Array-Modul (2) bytearray('b', ...)nicht funktioniert. Oder Sie können es einfach löschen.
— John Machin

2
@ John: Danke, behoben. In Zukunft können Sie die Änderungen einfach selbst vornehmen.
— SingleNegationElimination
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.