bmp hexadezimal einlesen?



  • Hallo,
    kennt jemand eine Möglichkeit, eine .bmp Datei hexadezimal einzulesen bzw. den eingelesenen String in Hexadezimalcode umzuwandeln?
    Danke für eure Hilfe...



  • Mache sie doch ein einfach mit fopen auf, dann hast Du einen Block jeweils mit fread auslesen (binaer) und printf und den Modifier %X in Hex ausschreiben. Die Version mit der STD - das machen schon die anderen.



  • Also eine Möglichkeit mit getc hätte ich ja. Mit fread bekomme ich es absolut nicht hin es binär auszulesen. Wenn ich es mit fread mache wird alles immer als string ausgelsen. Hier mal meine bisherige Lösung:

    FILE *file;
    int read;
    
    file = fopen("test2.bmp","r+b");
    
    if(file!=NULL)
    {
     while((read=getc(file))!=EOF) //Zeichen einzeln aus der Datei lesen
      {
       printf ("%X ",read); /oder cout << hex << read;
      }
    }
    

    Kannst du mir vielleicht nen Link zur Lösung mit STD geben?
    Was ist von dieser Lösung zu halten, schnell genug für Bildfolgen zum Livebearbeiten? Das Problem ist, ich möchte die Daten eigentlich erstmal zwischenspeichern um sie dann im Gesamten betrachten zu können. Daher wäre eine Lösung mit fread und das ganze dann in einen struct packen am besten.
    Jemand ne Idee?



  • Typ schrieb:

    Kannst du mir vielleicht nen Link zur Lösung mit STD geben?

    Mit STD meinst Du wahrscheinlich mit Mitteln der Standard-Library. Direkt einlesen und als hex ausgeben geht so

    #include <iostream>
    #include <fstream>
    #include <algorithm>    // copy
    #include <iterator>     // istreambuf_iterator, ostream_iterator
    
    struct CharToUInt // dient dazu einen char wie ein unsigned int auszugeben
    {
        CharToUInt( char c ) : m_c( c ) {}
        friend std::ostream& operator<<( std::ostream& out, const CharToUInt& c )
        {
            return out << static_cast< unsigned int >( c.m_c );
        }
    private:
        unsigned char   m_c;
    };
    
    int main()
    {
        std::copy( 
            std::istreambuf_iterator< char >( std::ifstream( "bild.bmp", std::ios_base::binary ) ), 
            std::istreambuf_iterator< char >(),
            std::ostream_iterator< CharToUInt >( std::cout << std::hex, " " ) );
        std::cout << std::endl;
        return 0;
    }
    

    Typ schrieb:

    Das Problem ist, ich möchte die Daten eigentlich erstmal zwischenspeichern um sie dann im Gesamten betrachten zu können.

    Zwischenspeichern - z.B. in einen String - ginge so

    #include <fstream>
    #include <sstream>
    
    int main()
    {
        std::stringstream buf;
        buf << std::ifstream( "bild.bmp", std::ios_base::binary ).rdbuf();
        // Ergebnis steht in buf.str()
        return 0;
    }
    

    Aber Achtung in 'buf' sind Binärdaten drin, also wahrscheinlich auch char mit dem Wert 0.

    Typ schrieb:

    Daher wäre eine Lösung mit fread und das ganze dann in einen struct packen am besten.
    Jemand ne Idee?

    Was für eine struct soll's denn sein?

    Gruß
    Werner


Anmelden zum Antworten