I need to send a message of bytes in Python and I need to convert an unsigned integer number to a byte array. How do you convert an integer value to an array of four bytes i
This is kind of an old thread, but in Python 3.2+ now you can simply say:
number = 100
number.to_bytes(4, byteorder = 'big')
or byteorder = 'little'
as per your needs. Documentation here.
Have a look at the struct
module. Probably all you need is struct.pack("I", your_int)
to pack the integer in a string, and then place this string in the message. The format string "I"
denotes an unsigned 32-bit integer.
If you want to unpack such a string to a tuple of for integers, you can use struct.unpack("4b", s)
:
>>> struct.unpack("4b", struct.pack("I", 100))
(100, 0, 0, 0)
(The example is obviously on a little-endian machine.)
It can be done with ctypes
as well. It's especially useful for converting floating point numbers to bytes. Example:
>>> bytes(ctypes.c_uint32(0x20))
b' \x00\x00\x00'
>>> bytes(ctypes.c_double(1))
b'\x00\x00\x00\x00\x00\x00\xf0?'
Sven has you answer. However, byte shifting numbers (as in your question) is also possible in Python:
>>> [hex(0x12345678 >> i & 0xff) for i in (24,16,8,0)]
['0x12', '0x34', '0x56', '0x78']
And for completeness: you can also use the array module:
>>> from array import array
>>> a = array('I', [100]) # note that 'I' and such are machine-dependent.
>>> a.tostring()
'\d\x00\x00\x00'
>>> a.byteswap()
>>> a.tostring()
'\x00\x00\x00\d'
You can pretty much do the same thing:
>>> number = 100
>>> array[0] = (number>>24) & 0xff
>>> array[1] = (number>>16) & 0xff
>>> array[2] = (number>>8) & 0xff
>>> array[3] = number & 0xff
or you can do something shorter:
>>> array = [(number>>(8*i))&0xff for i in range(3,-1,-1)]