Casten von unsigned char to char
-
Hallo!
Ich lese aus eine Bin-File Daten aus und definiere für diese Daten ein struct.
typedef struct BRG { unsigned char Blue; unsigned char Red; unsigned char Green; };Diese Daten werden richtig verspeichert in dem Struct, also wenn ich es mir mit printf ausgeben, steht es genauso dort wie im hex-editor.
Aber wie schreibe ich dieses Struct jetzt wieder in einer Datei? Habe es mit einem Cast zu (char*) versucht, aber das funktioniert nicht, da sind die Daten dann komplett anders!?
Danke!
-
Ich verstehe nicht so richtig, was du erreichen willst, bzw. wie du versuchst dein struct auszugeben. Ein wenig mehr Code wäre nett.
Das struct als gesamtes kannst du nicht einfach so ausgeben (sofern du keine dementsprechenden Operatoren definiert hast). Du musst die Elemente einzelnen über myBRG.Blue etc. ansprechen und ausgeben.
-
Ich habe dieses struct myBRG als Array.
myBRG = new B8R8G8[length];z.B.
myBRG[0].Red = 0xFF;
myBRG[0].Green = 0x00;
myBRG[0].Blue = 0x11;
myBRG[1].Red = 0x22;
myBRG[1].Green = 0x0D;
myBRG[1].Blue = 0xD0;Und das will ich jetzt genauso wie es dort steht in ein File schreiben.
Das File sollte als so aussehen (in de Reihenfolge): FF 00 11 22 0D D0
file.write (myBRG,length);geht nicht, deshalb habe ich
file.write ((char*) &myBRG,length);versucht. Ich bin mir aber wirklich sicher ob ich damit für alle Fälle sichergestellt habe, dass das struct richtig im File landet (also ohne Bitverschiebungen, richtige Reihenfolge etc.)...oder gibt es da eine bessere Methode?
-
1. In C++ ist das
typedefvor dem struct unnötig, sowas wird nur in C verwendet. Es reicht zu schreiben:struct RGB { unsigned char red; unsigned char green; unsigned char blue; };2. Meinst du nicht eher RGB statt BRG? Ich habe jedenfalls noch nie etwas von BRG gehört.
3. Das was du machst, wird wohl Probleme verursachen wegen Padding oder Byte-Reihenfolge. Die Bitdarstellung dagegen sollte keine Probleme machen.
4. Mach es, wie cerotidinon es gesagt hat. Schreib jeden Wert einzeln raus. Falls du sogar nur unsigned char schreibst, gibt es sogar einen kleinen Trick, da man es mit Schablonen zu tun hat im IO Stream Bereich:typedef std::basic_ofstream<unsigned char> uofstream; uofstream file("file.dat", std::ios::binary | std::ios::out); for(int i = 0; i < length; ++i) { file.write(myRGB[i].red, 1); file.write(myRGB[i].green, 1); file.write(myRGB[i].blue, 1); } file.close();Grüssli
-
Dravere schrieb:
1. In C++ ist das
typedefvor dem struct unnötig, sowas wird nur in C verwendet. Es reicht zu schreiben:struct RGB { unsigned char red; unsigned char green; unsigned char blue; };Was ist eigentlich der Unterschied zwischen struct RGB {} und typedef struct {} RGB?
-
Dax schrieb:
Was ist eigentlich der Unterschied zwischen struct RGB {} und typedef struct {} RGB?
In C++ ist beides das gleiche, in C allerdings nicht. In C++ wird daher das erstere bevorzugt, in C dagegen das zweitere.
In C ist der Unterschied der folgende:
/* WARNUNG - C QUELLCODE - WARNUNG */ struct MyNormalStruct { }; /* Verwendung: */ struct MyNormalStruct var; struct MyNormalStruct* pointer = &var; /* usw., es muss also immer ein struct davor geschrieben werden in C. Um dies zu vereinfachen, gibt es allerdings die typedef Syntax. */ typedef struct { } MyTypedefStruct; /* Verwendung */ MyTypedefStruct var; MyTypedefStruct* pointer = &var; /* deutlich angenehmer zu verwenden. Wie gesagt, in C++ ist dies unnötig. */ /* WARNUNG - C QUELLCODE - WARNUNG */Es gibt, glaub ich, noch ein paar Restriktionen, wenn man die
typedefSyntax verwendet, kann mich nur gerade nicht mehr daran erinnern, was es war.Grüssli