Search code examples
pythonunion

Equivalent of a C union in Python?


Say I'm having a following code in C:

union u_type
{
    uint32_t data;
    uint8_t  chunk[4];
} 32bitsdata;

32bitsdata.chunk[0] = some number;
32bitsdata.chunk[1] = some number;
32bitsdata.chunk[2] = some number;
32bitsdata.chunk[3] = some number;

printf("Data in 32 bits: %d\n", 32bitsdata.data);

How could I do similar thing in ython?

I'm trying to read a binary file (byte by byte) - already got it working, and combining every 3 bytes into one int. Heard struct would do the trick, but I'm not really sure how.


Solution

  • What about ctypes?

    from ctypes import (
            Union, Array, 
            c_uint8, c_uint32, 
            cdll, CDLL
    ) 
    
    class uint8_array(Array):
        _type_ = c_uint8
        _length_ = 4
    
    class u_type(Union):
        _fields_ = ("data", c_uint32), ("chunk", uint8_array)
    
    # load printf function from Dynamic Linked Libary libc.so.6 (I'm using linux)
    libc = CDLL(cdll.LoadLibrary('libc.so.6')._name)
    printf = libc.printf
    
    if __name__ == "__main__":
        # initialize union
        _32bitsdata = u_type()
        # set values to chunk
        _32bitsdata.chunk[:] = (1, 2, 3, 4)
        # and print it
        printf(b"Data in 32 bits: %d\n", _32bitsdata.data)