92

How can I represent a byte array (like in Java with byte[]) in Python? I'll need to send it over the wire with gevent.

byte key[] = {0x13, 0x00, 0x00, 0x00, 0x08, 0x00};

4 Answers 4

98

In Python 3, we use the bytes object, also known as str in Python 2.

# 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])

I find it more convenient to use the base64 module...

# Python 3
key = base64.b16decode(b'130000000800')

# Python 2
key = base64.b16decode('130000000800')

You can also use literals...

# Python 3
key = b'\x13\0\0\0\x08\0'

# Python 2
key = '\x13\0\0\0\x08\0'
Sign up to request clarification or add additional context in comments.

2 Comments

For the record, instead of base64.b16decode(x), you can use, simply, x.decode("hex"). It lets you get by with one less import, at least. :)
bytes.fromhex('130000000800') in Python 3.
36

Just use a bytearray (Python 2.6 and later) which represents a mutable sequence of bytes

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

Indexing get and sets the individual bytes

>>> key[0]
19
>>> key[1]=0xff
>>> key
bytearray(b'\x13\xff\x00\x00\x08\x00')

and if you need it as a str (or bytes in Python 3), it's as simple as

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

3 Comments

Not so simple with 3.x; fubar = str(key); print(len(key), len(fubar)) produces 6 38. In any case (1) "string" is very vague terminology (2) if he wants mutability, he can mutate his original list
@John: Good point about str working differently for bytearray in Python 3 - fixed. I mentioned mutability mainly to distinguish it from bytes, but the point is also that you don't need to have an intermediate step of having your data in a list at all.
It's a fair chance that what the OP really needs is something like struct.pack("<IH", 19, 8) ...
6

An alternative that also has the added benefit of easily logging its output:

hexs = "13 00 00 00 08 00"
logging.debug(hexs)
key = bytearray.fromhex(hexs)

allows you to do easy substitutions like so:

hexs = "13 00 00 00 08 {:02X}".format(someByte)
logging.debug(hexs)
key = bytearray.fromhex(hexs)

Comments

3

Dietrich's answer is probably just the thing you need for what you describe, sending bytes, but a closer analogue to the code you've provided for example would be using the bytearray type.

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

3 Comments

Fine for Python 2.5 or earlier, but the built-in bytearray is really the way to go if you want, er, a byte array.
@TokenMacGuy: Your answer needs another 2 edits: (1) mentions the array module (2) bytearray('b', ...) doesn't work. Or you could just delete it.
@John: thanks, fixed. In the future, just go right ahead and make the edits yourself.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.