.BMP - OpenGL -> Hex to Dec Problem
-
Hallo zusammen,
ich bin gerade dabei Texture für OpenGL zu laden. Ich habe ein Problem bei der Umwandlung von Hex-Werten in Dezimalzahlen.
Z.B. möchte ich die Breite und Höhe der Bitmap-Datei auslesen.
ifs.seekg(18, ios_base::beg); char *cwidth = new char[4]; ifs.read(cwidth, 4);Nun steht im Hex-Editor für die Breite (256 px) 00-01-00-00. (Breite und Höhe wird in 4 Byte großen Blöcken gespeichert)
Eigentlich ist der Wert 256 in Hex 100.Wie kann ich nun die Hexzahl in eine Dezimalzahl umwandeln? Gibt es dafür eine fertige C++ Funktion? Ich habs schon mit strtol versucht.
-
Haha, das geht ganz einfach:
std::string str = "0xFF"; std::istringstream stream(str); int result; stream >> std::hex >> result;
-
BMP-Dateien werden wohl binär kodiert sein. Was willst du da von Hex nach Dezimal konvertieren?
-
Wozu umwandeln ??
ifs.seekg(18, std::ios_base::beg); int cwidth; ifs.read(reinterpret_cast<char*>(&cwidth), 4);Kurt
-
Es gibt keine Hex-Zahlen. Das ist nur eine Darstellung, genau wie Dezimalzahlen eine Darstellung sind.
Es gibt in C++ keine fertige Funktion für so etwas, aber die Bytes lassen sich ganz leicht wieder zusammensetzen:
unsigned char width_bytes[4]; ifs.read(reinterpret_cast<char *>(width_bytes), sizeof(width_bytes)); //der korrekte Typ aus [c]<cstdint>[/c] typedef std::uint_fast32_t UInt32; auto const width = (static_cast<UInt32>(width_bytes[0])) | (static_cast<UInt32>(width_bytes[1]) << 8) | (static_cast<UInt32>(width_bytes[2]) << 16) | (static_cast<UInt32>(width_bytes[3]) << 24);ZuK schrieb:
Wozu umwandeln ??
ifs.seekg(18, std::ios_base::beg); int cwidth; ifs.read(reinterpret_cast<char*>(&cwidth), 4);Kurt
Mögliche Fehler:
intist kleiner als 4 -> "buffer overflow"intist größer als 4 -> in den restlichen Bytes steht Müll, weil nicht initialisiertintist nicht Little-Endian
Hässlich:
- die Größe ist eine Magic Numberreinterpret_castvonint *aufchar *signed, wenn das gar nicht erforderlich ist
-
Mögliche Fehler:
....intist nicht Little-Endian
Das sollten wir jetzt besser nicht diskutieren.
Die Byteschieberei funktioniert nur wenn beides (File und System ) Little Endian ist.
Der cast funktioniert auch wenn beides Big Endian ist.
Kurt
-
ZuK schrieb:
Mögliche Fehler:
....intist nicht Little-Endian
Das sollten wir jetzt besser nicht diskutieren.
Die Byteschieberei funktioniert nur wenn beides (File und System ) Little Endian ist.
Der cast funktioniert auch wenn beides Big Endian ist.
KurtÄh, die Datei ist in Little Endian, da gibt es kein "wenn".
Meine Variante (Byte-Schieberei?) funktioniert dann auf jedem System.
-
ZuK schrieb:
Das sollten wir jetzt besser nicht diskutieren.
Die Byteschieberei funktioniert nur wenn beides (File und System ) Little Endian ist.
Der cast funktioniert auch wenn beides Big Endian ist.
Kurt
Byteschieberei ist reine Mathematik und unabhängig von jedweder Endianess.
-
TyRoXx schrieb:
Äh, die Datei ist in Little Endian, da gibt es kein "wenn".
Meine Variante (Byte-Schieberei?) funktioniert dann auf jedem System.Ja das stimmt. Sorry
Kurt
-
aptem schrieb:
Hallo zusammen,
ich bin gerade dabei Texture für OpenGL zu laden. Ich habe ein Problem bei der Umwandlung von Hex-Werten in Dezimalzahlen.
Z.B. möchte ich die Breite und Höhe der Bitmap-Datei auslesen.
ifs.seekg(18, ios_base::beg); char *cwidth = new char[4]; ifs.read(cwidth, 4);Nun steht im Hex-Editor für die Breite (256 px) 00-01-00-00. (Breite und Höhe wird in 4 Byte großen Blöcken gespeichert)
Eigentlich ist der Wert 256 in Hex 100.Wie kann ich nun die Hexzahl in eine Dezimalzahl umwandeln? Gibt es dafür eine fertige C++ Funktion? Ich habs schon mit strtol versucht.
umwandeln? vergiss es! siehe beitrag von ZuK, aber ruck-zuck!
