Search code examples
pythonfile-iobinaryfiles

How to read structured binary data from a file?


The following C++ code writes a header to a file:

#include <iostream>

struct Header
{
    uint16_t name;
    uint8_t type;
    uint8_t padding;
    uint32_t width, height;
    uint32_t depth1, depth2;
    float dMin, dMax;
};

int main()
{

  Header header;
  header.name = *reinterpret_cast<const uint16_t*>("XO");
  header.type = true;
  header.width  = (uint32_t)512;
  header.height = (uint32_t)600;
  header.depth1  = (uint32_t)16;
  header.depth2 = (uint32_t)25;
  header.dMin = 5.0;
  header.dMax = 8.6;

  FILE* f = fopen("header.bin", "wb");
    fwrite(&header, sizeof(Header), 1, f);
}

I am looking to read these header.bin files using Python. In C++ I would be doing something like:

fread(&header, sizeof(Header), 1, f)

But I'm unsure how to read the bytes and convert them into the corresponding fields that the Header struct has in Python?


Solution

  • Use the struct module to define the binary layout of a C-like struct and de-/serialise it:

    import struct
    
    # Format String describing the data layout
    layout = "H B x 2L 2L 2f"
    
    # Object representing the layout, including size
    header = struct.Struct(layout)
    
    with open("header.bin", "rb") as in_stream:
        print(header.unpack(in_stream.read(header.size))
    

    The layout is a format string describing the fields in-order, e.g. H for uint16_t, B for uint8_t, x for a pad byte, and so on.