How to convert integer value to array of four bytes in python

后端 未结 7 1899
太阳男子
太阳男子 2020-12-14 06:54

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

相关标签:
7条回答
  • 2020-12-14 07:40

    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.

    0 讨论(0)
  • 2020-12-14 07:44

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

    0 讨论(0)
  • 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?'
    
    0 讨论(0)
  • 2020-12-14 07:53

    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']
    
    0 讨论(0)
  • 2020-12-14 07:53

    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'
    
    0 讨论(0)
  • 2020-12-14 07:57

    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)]
    
    0 讨论(0)
提交回复
热议问题