.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:

    • int ist kleiner als 4 -> "buffer overflow"
    • int ist größer als 4 -> in den restlichen Bytes steht Müll, weil nicht initialisiert
    • int ist nicht Little-Endian
      Hässlich:
      - die Größe ist eine Magic Number
    • reinterpret_cast von int * auf char *
    • signed , wenn das gar nicht erforderlich ist


  • Mögliche Fehler:
    ....

    • int ist 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:
    ....

    • int ist 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.


  • Mod

    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! 😃


Anmelden zum Antworten