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};
d0ctor
quelle

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'
Dietrich Epp
quelle
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'
Scott Griffiths
quelle
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)
TomSchober
quelle
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'
>>> 
SingleNegationElimination
quelle
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