Python 3 Building an array of bytes
I need to build a tcp frame with raw binary data, but all examples and tutorials I've found talking about bytes always involve conversion from a string, and that's not what I need.
In short, I need to build just an array of bytes:
0xA2 0x01 0x02 0x03 0x04
Please note that I come from C/C++ world.
I've tried this:
frame = b""
frame += bytes( int('0xA2',16) )
frame += bytes( int('0x01',16) )
frame += bytes( int('0x02',16) )
frame += bytes( int('0x03',16) )
frame += bytes( int('0x04',16) )
Then, throw this frame variable to send method of socket, but not working as expected as frame doesn't contain what I want...
I know this is a very basic question about Python, so if you could point me in the right direction...
Solution 1:
Use a bytearray
:
>>> frame = bytearray()
>>> frame.append(0xA2)
>>> frame.append(0x01)
>>> frame.append(0x02)
>>> frame.append(0x03)
>>> frame.append(0x04)
>>> frame
bytearray(b'\xa2\x01\x02\x03\x04')
or, using your code but fixing the errors:
frame = b""
frame += b'\xA2'
frame += b'\x01'
frame += b'\x02'
frame += b'\x03'
frame += b'\x04'
Solution 2:
what about simply constructing your frame from a standard list ?
frame = bytes([0xA2,0x01,0x02,0x03,0x04])
the bytes()
constructor can build a byte frame from an iterable containing int
values. an iterable is anything which implements the iterator protocol: an list, an iterator, an iterable object like what is returned by range()
...
Solution 3:
frame = b'\xa2\x01\x02\x03\x04'
wasn't mentionned till now...
Solution 4:
agf's bytearray solution is workable, but if you find yourself needing to build up more complicated packets using datatypes other than bytes, you can try struct.pack()
. http://docs.python.org/release/3.1.3/library/struct.html