Python 3 Building an array of bytes

Question:

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…

Asked By: Pherrymason

||

Answers:

I think Scapy is what are you looking for.

http://www.secdev.org/projects/scapy/

you can build and send frames (packets) with it

Answered By: Venec

Use a bytearray:

>>> frame = bytearray()
>>> frame.append(0xA2)
>>> frame.append(0x01)
>>> frame.append(0x02)
>>> frame.append(0x03)
>>> frame.append(0x04)
>>> frame
bytearray(b'xa2x01x02x03x04')

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'
Answered By: agf

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()

Answered By: Adrien Plisson
frame = b'xa2x01x02x03x04'

wasn’t mentionned till now…

Answered By: glglgl

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

Answered By: Russell Borogove

Here is a solution to getting an array (list) of bytes:

I found that you needed to convert the Int to a byte first, before passing it to the bytes():

bytes(int('0xA2', 16).to_bytes(1, "big"))

Then create a list from the bytes:

list(frame)

So your code should look like:

frame = b""
frame += bytes(int('0xA2', 16).to_bytes(1, "big"))
frame += bytes(int('0x01', 16).to_bytes(1, "big"))
frame += bytes(int('0x02', 16).to_bytes(1, "big"))
frame += bytes(int('0x03', 16).to_bytes(1, "big"))
frame += bytes(int('0x04', 16).to_bytes(1, "big"))
bytesList = list(frame)

The question was for an array (list) of bytes. You accepted an answer that doesn’t tell how to get a list so I’m not sure if this is actually what you needed.

Answered By: King Tech
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.