Problem mit casts



  • Ich suche eine schlaue Lösung aus einem char-Array mit folgender (simplifizierter) Struktur Daten auszulesen:

    [dType,dEntry, dType,dEntry, dType,dEntry, ...]

    dType ist immer ein signed char
    dEntry ist entweder ein, zwei oder vier Byte lang

    Abhängig von dType soll das folgende dEntry als

    -1 = 8 bit char
    1 = 8 bit byte
    2 = 16bit int
    4 = 32bit float

    interpretiert werden. Was ich bisher mache ist folgendes:

    #include <iostream>
    using std::cout;
    using std::endl;
    
        const int arr=40;
        char datei[arr];
    
        // demodata
        void dummyDatei()
        {
            union bit16 {
                unsigned char a,b;
                unsigned short int k;
            } in;
    
            in.k = 12345;
    
            union bit32 {
                unsigned char a,b,c,d;
                float k;
            } fl;
    
            fl.k = 12345.12345;
    
            int i = -1;
    
            // chars
            datei[++i]= -1;    datei[++i]= 'T';
            datei[++i]= -1;    datei[++i]= 'e';
            datei[++i]= -1;    datei[++i]= 's';
            datei[++i]= -1;    datei[++i]= 't';
    
            // 8 bit byte
            datei[++i]= 1;    datei[++i]= 0x1;
            datei[++i]= 1;    datei[++i]= 0x2;
            datei[++i]= 1;    datei[++i]= 0x3;
            datei[++i]= 1;    datei[++i]= 0x4;
    
            // 16 bit byte
            datei[++i]= 2;    datei[++i]= 0xAA;    datei[++i]= 0xAA;
    
            // 32 bit float
            datei[++i]= 4;    datei[++i]= 0x01;    datei[++i]= 0x01;    datei[++i]= 0x01;    datei[++i]= 0xBB;
    
            // more chars
            datei[++i]= -1;    datei[++i]= 'T';
            datei[++i]= -1;    datei[++i]= 'e';
            datei[++i]= -1;    datei[++i]= 's';
            datei[++i]= -1;    datei[++i]= 't';
    
            // rest to 0x00
            while (i < arr)
                datei[++i]= 0x00;
        }
    
        // convert methods
        char toChar(char * pos) {return *pos;}
        unsigned short int toByte(char * pos) {return (unsigned short int)(*pos);}
        unsigned short int toInt(char * pos) {return *(unsigned short int*)(pos);}
        float toFloat(char * pos) {return *(float*)(pos);}
    
        // parser
        int parseOne(char * pos)
        {
            int type = (int)*pos;
            ++pos;        
    
            switch (type)
            {
            case -1:
                cout << "char:  '" << toChar(pos) << "'";
                break;
            case 1:
                cout << " 8bit: '" << toByte(pos) << "'";
                break;
            case 2:
                cout << "16bit: '" <<  toInt(pos) << "'";
                break;
            case 4:
                cout << "float: '" << toFloat(pos) << "'";
                break;
            }
            if (type) cout << endl;
            else return 0;
    
            return abs(type)+1;
        }
    
    // main
    int main(int , char )
    {
        dummyDatei();
        cout << "THE ARRAY:" << endl << datei << endl << endl;
    
        cout << "PARSED:" << endl;
    
        char * datPoint = datei;
    
        int inc=1;
        while (inc)
        {
            inc = parseOne(datPoint);
            datPoint += inc;
        }
    }
    

    Ausgabe:

    Starte /test...
    THE ARRAY:
    �T�e�s�t����T�e�s�t

    PARSED:
    char: 'T'
    char: 'e'
    char: 's'
    char: 't'
    8bit: '1'
    8bit: '2'
    8bit: '3'
    8bit: '4'
    16bit: '43690'
    float: '-0.00196844'
    char: 'T'
    char: 'e'
    char: 's'
    char: 't'

    /test beendet, Rückgabewert 0

    Was ich haben möchte ist eine Funktion die in etwa so arbeitet:

    rück transform(short int dataType, char * pos) 
    {...}
    

    also alle mit _dem_ _selben_ Aufruf.

    Geht sowas, wenn ja wie?



  • Hab mir deine Funktion nicht im Detail angesehen, aber grundsätzlich kannst du sowas z.B. mit Templates realisieren. Überladung wäre auch noch eine Möglichkeit (aber eventuell eine, die mehr Tipparbeit und redundanten Code bedeutet).


Anmelden zum Antworten