Ignore:
Timestamp:
03/07/12 14:08:49 (13 years ago)
Author:
tbretz
Message:
Added automatic checksum checking.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Mars/mcore/fits.h

    r12845 r12996  
    4141#endif
    4242
     43#include "checksum.h"
     44
    4345namespace std
    4446{
     
    8890        Columns cols;
    8991        Keys    keys;
     92
     93        int64_t datasum;
    9094
    9195        string Trim(const string &str, char c=' ') const
     
    218222            num_rows      = Get<size_t>("NAXIS2");
    219223            num_cols      = Get<size_t>("TFIELDS");
     224            datasum       = Get<int64_t>("DATASUM", -1);
    220225
    221226            size_t bytes = 0;
     
    382387        // Values of keys are always signed
    383388        template<typename T>
    384             T Get(const string &key, const string &deflt) const
     389            T Get(const string &key, const T &deflt) const
    385390        {
    386391            const map<string,Entry>::const_iterator it = keys.find(key);
     
    416421
    417422    size_t fRow;
     423
     424    Checksum fChkHeader;
     425    Checksum fChkData;
    418426
    419427    bool ReadBlock(vector<string> &vec)
     
    428436                break;
    429437
     438            fChkHeader.add(c, 80);
     439
    430440//            if (c[0]==0)
    431441//                return vector<string>();
     
    527537
    528538            if (block[0].substr(0, 9)=="SIMPLE  =")
     539            {
     540                fChkHeader.reset();
    529541                continue;
     542            }
    530543
    531544            if (block[0].substr(0, 9)=="XTENSION=")
     
    544557                }
    545558
    546                 fBufferRow.resize(fTable.bytes_per_row);
     559                fBufferRow.resize(fTable.bytes_per_row + 4-fTable.bytes_per_row%4);
    547560                fBufferDat.resize(fTable.bytes_per_row);
    548561
     
    565578    }
    566579
    567     void ReadRow(size_t row)
     580    uint8_t ReadRow(size_t row)
    568581    {
    569582        // if (row!=fRow+1) // Fast seeking is ensured by izstream
    570583        seekg(fTable.offset+row*fTable.bytes_per_row);
    571584
     585        // For the checksum we need everything to be correctly aligned
     586        const uint8_t offset = (row*fTable.bytes_per_row)%4;
     587
     588        auto ib = fBufferRow.begin();
     589        auto ie = fBufferRow.end();
     590        *ib++ = 0;
     591        *ib++ = 0;
     592        *ib++ = 0;
     593        *ib   = 0;
     594
     595        *--ie = 0;
     596        *--ie = 0;
     597        *--ie = 0;
     598        *--ie = 0;
     599
     600        fBufferRow.assign(fBufferRow.size(), 0);
     601
     602        read(fBufferRow.data()+offset, fTable.bytes_per_row);
     603        //fin.clear(fin.rdstate()&~ios::eofbit);
     604
     605        if (row==fRow+1)
     606            fChkData.add(fBufferRow);
     607
    572608        fRow = row;
    573609
    574         read(fBufferRow.data(), fBufferRow.size());
    575         //fin.clear(fin.rdstate()&~ios::eofbit);
     610        return offset;
    576611    }
    577612
     
    586621    bool GetRow(size_t row)
    587622    {
    588         ReadRow(row);
     623        const uint8_t offset = ReadRow(row);
    589624        if (!good())
    590625            return good();
    591626
     627        const char *ptr = fBufferRow.data() + offset;
     628
    592629        for (Addresses::const_iterator it=fAddresses.begin(); it!=fAddresses.end(); it++)
    593630        {
    594631            const Table::Column &c = it->second;
    595632
    596             const char *src = fBufferRow.data() + c.offset;
     633            const char *src = ptr + c.offset;
    597634            char *dest = reinterpret_cast<char*>(it->first);
    598635
     
    782819    void PrintKeys() const { fTable.PrintKeys(); }
    783820    void PrintColumns() const { fTable.PrintColumns(); }
     821
     822    bool IsHeaderOk() const { return fTable.datasum<0?false:(fChkHeader+Checksum(fTable.datasum)).valid(); }
     823    bool IsFileOk() const { return (fChkHeader+fChkData).valid(); }
     824
    784825};
    785826
Note: See TracChangeset for help on using the changeset viewer.