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 langAbhängig von dType soll das folgende dEntry als
-1 = 8 bit char
1 = 8 bit byte
2 = 16bit int
4 = 32bit floatinterpretiert 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�tPARSED:
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).