How to byte-swap a 32-bit integer in python?

前端 未结 3 916
伪装坚强ぢ
伪装坚强ぢ 2020-12-15 17:55

Take this example:

i = 0x12345678
print(\"{:08x}\".format(i))
   # shows 12345678
i = swap32(i)
print(\"{:08x}\".format(i))
   # should print 78563412


        
相关标签:
3条回答
  • 2020-12-15 18:36

    One method is to use the struct module:

    def swap32(i):
        return struct.unpack("<I", struct.pack(">I", i))[0]
    

    First you pack your integer into a binary format using one endianness, then you unpack it using the other (it doesn't even matter which combination you use, since all you want to do is swap endianness).

    0 讨论(0)
  • 2020-12-15 18:37

    From python 3.2 you can define function swap32() as the following:

    def swap32(x):
        return int.from_bytes(x.to_bytes(4, byteorder='little'), byteorder='big', signed=False)
    

    It uses array of bytes to represent the value and reverses order of bytes by changing endianness during conversion back to integer.

    0 讨论(0)
  • 2020-12-15 18:43

    Big endian means the layout of a 32 bit int has the most significant byte first,

    e.g. 0x12345678 has the memory layout

    msb             lsb
    +------------------+
    | 12 | 34 | 56 | 78|
    +------------------+
    

    while on little endian, the memory layout is

    lsb             msb
    +------------------+
    | 78 | 56 | 34 | 12|
    +------------------+
    

    So you can just convert between them with some bit masking and shifting:

    def swap32(x):
        return (((x << 24) & 0xFF000000) |
                ((x <<  8) & 0x00FF0000) |
                ((x >>  8) & 0x0000FF00) |
                ((x >> 24) & 0x000000FF))
    
    0 讨论(0)
提交回复
热议问题