W
Maffe001 schrieb:
die Ausgangssituation ist immer die, dass ich ein unsigned char* bekomme und daraus die Daten für die Structs lesen muss. Die Länge ist zusätzlich bekannt.
Leider kann ich das nicht so machen:
unsigned char *pcData; //die Daten
TMyStruct *pMyStruct = (TMyStruct*) pcData; //ich weiss, wird nicht gern gesehen
da das Ganze in big-endian vorliegt.
Für das Auslesen der einzelnen Werte des Structs hab ich mir schon ein Template geschrieben.
Doch wie kann ich das jetzt für verschiedenste Structs (die Member variieren von unsigned short, unsigned int, unsigned char, unsigned char[]) machen? Irgendwie bin ich fast der Meinung, dass das nicht möglich ist.
Hat jmd schon mal so was umgesetzt?
Ja, sogar schon öfter. Die Lösung ist immer ein binärer Stream. Du baust Dir eine eigene Stream-Klasse, die von std::basic_ios< char > abgeleitet ist, und implementierst für die einzelnen rudimentären Typen (char, int, long, usw ) die operator>>( Type& x )-Methoden. In eben diesen Methoden kannst Du dann alle Big- und little-Endian-Probleme erledigen.
Danach brauchst Du noch einen streambuf, auf dem der Stream arbeiten kann. Ein Memory-Streambuf zu machen ist sehr einfach - z.B.:
#include <streambuf>
class MemoryBuf : public std::streambuf
{
public:
typedef std::streambuf base_type;
MemoryBuf( char* first, char* last )
: base_type()
{
setg( first, first, last );
}
};
den legst Du an, übergibst Anfang und Ende Deines char-Arrays, und anschließend legst Du Deinen Stream an und übergibst einen Pointer auf eben diesen MemoryBuf. Besser wäre es noch, Du baust (oder hast) einen Streambuf für Deine Original-Zeichen-Strom-Quelle (z.B. File,Socket, etc. )
Dann muss man leider für jede struct einen operator>> schreiben
DeinStream& operator>>( DeinStream& in, EineStruct& s );
in der dann die einzelnen Member der Struct eingelesen werden. Wenn Du das für zu viel Arbeit und für zu kompliziert hälst, dann lass Dir sagen: es gibt in C++ keine einfachere Lösung, die Dir ein solches Maß an Problem-Behandlung und Flexibilität liefert. Im übrigen ist das auch noch ziemlich Standard-like
Gruß
Werner