Listing 1

struct Mgt {
    bitset<8> tableId;
    bitset<1> sectionSyntaxIndicator;
    bitset<1> privateIndicator;
    bitset<2> reserved2a;
    bitset<12> sectionLength;
    bitset<16> tableIdExtention;
    bitset<2> reserved2b;
    bitset<5> versionNumber;
    bitset<1> currentNextIndicator;
    bitset<8> sectionNumber;
    bitset<8> lastSectionNumber;
    bitset<8> protocolVersion;
    bitset<16> tablesDefined;
    list< MgtDefinedTable > tables;
    bitset<12> descriptorsLength;
    list< SIDescriptor > descriptors;
    bitset<4> reserved4;
} mgt;
ibstream& operator>>(ibstream& source, Mgt& mgt)
{
    source >> mgt.tableId;
    source >> mgt.sectionSyntaxIndicator;
    source >> mgt.privateIndicator;
    source >> mgt.reserved2a;
    source >> mgt.sectionLength;
    source >> mgt.tableIdExtention;
    source >> mgt.reserved2b;
    source >> mgt.versionNumber;
    source >> mgt.currentNextIndicator;
    source >> mgt.sectionNumber;
    source >> mgt.lastSectionNumber;
    source >> mgt.protocolVersion;
    source >> mgt.tablesDefined;

    mgt.tables.clear();
    for (size_t i = 0; i < mgt.tablesDefined.to_ulong(); ++i) {
        MgtDefinedTable table;
        mgt.tables.push_back(table);
        source >> mgt.tables.back();
    }
    assert(mgt.tablesDefined.to_ulong() == mgt.tables.size());
    source.SkipBits(4);
    source >> mgt.descriptorsLength;
    for (size_t bytesToGo=mgt.descriptorsLength.to_ulong(); bytesToGo > 2; ) {
        SIDescriptor d;
        mgt.descriptors.push_back(d);
        source >> mgt.descriptors.back();
        bytesToGo -= min(bytesToGo, (1 + 1 + 
                        mgt.descriptors.back().descriptorLength.to_ulong()));
    }
    return source ;
}
istrstream istr(data, ios::binary);
ibstream ibs(istr.rdbuf()); 
ibs >> mgt;