erste 4 Byte aus Hexfile in INT konvertieren



  • Hi Leute,

    Ich habe folgendes Problem:

    Mir liegt ein Binärfile vor welches vom Aufbau her immer gleich ist.
    Die ersten 4 Byte ergeben zusammen eine Zahl.
    Diese will ich mithilfe von C++ herausfinden.

    Mir ist es nicht gelungen dies zu tun.
    Ich hoffe ihr könnt mir helfen.

    Aufbau des Files im Hex Editor:

    00 00 04 3E

    Das Ergebnis wäre also 1086.
    Ich hoffe ihr versteht mein Problem und könnt mir eine Lösung anbieten.

    MfG
    Paul



  • Klar, aber erst: Wie liesst du die ersten 4 Byte ein?



  • Das ist eines der Probleme!

    Mein Ansatz war:

    char char;

    while (Quelldatei.get(c)) {
    char.put(c);
    }


  • Mod

    Bist du sicher, dass du bei der richtigen Sprache bist?



  • ja wieso?

    Das ist nur ein Ausschnitt, nicht der ganze Code!
    Hier ist ein Teil davon: Leider ist das Ergebnis falsch!

    Ausgabe: 00462

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
        ifstream quelle;
        quelle.open("C:\\Users\\Daffi\\Desktop\\Bearbeiten2", ios::in | ios::binary );
        if (!quelle)                              // Fehler beim Öffnen?
            cerr << "Eingabe-Datei kann nicht geöffnet werden\n";
    
        char c;
    
        while (quelle.get(c))
           cout<<(int)c;
    
        quelle.close();
        getchar();
        return 0;
    }
    


  • Wenn du 4 Bytes in ein int verwandeln moechtest, dann solltest du diese erstmal speichern, z.B. in einem Array.



  • ich weis, das Problem ist nur ,dass ich die 4 Bytes nicht herausbekomme, sonst würde ich sie ja in ein Array speichern.

    Das speichern ist ja nicht das Problem,dies in der Schleife zu tun.
    Nur wenn ich das in meinem Code mache speichert er nur mist!


  • Mod

    daffi schrieb:

    Nur wenn ich das in meinem Code mache speichert er nur mist!

    Dann zeig betreffenden Code doch mal!



  • Endian beachten!



  • Zur Zeit siehts so aus:

    Ich nehme mir den Char (1 Byte) und versuche mit Bitschiebeoperationen jeweils die einzellnen Zeichen in ein Char Array zu speichern.

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
        char array[8];
        char c;
    
        ifstream quelle;
        quelle.open("C:\\Users\\Daffi\\Desktop\\Bearbeiten2", ios::in | ios::binary );
        if (!quelle)                              // Fehler beim Öffnen?
            cerr << "Eingabe-Datei kann nicht geöffnet werden\n"; 
    
        int i=0;
        while (quelle.get(c)){
    
           array[i]=c>>4;
           array[i+1]=c<<4;
           i += 2;
       }
    
        cout<<endl<<(int)array;
    
        quelle.close();
        getchar();
        return 0;
    }
    


  • array[i]=c>>4;
           array[i+1]=c<<4;
    

    Was bezweckst du damit?

    Und die Funktion, nach der du suchst, ist wahrscheinlich read . open hast du ja auch gefunden. Ansonsten empfehle ich dir, lieber ein C++ Buch zu lesen.



  • Wie gesagt im hexeditor zeit er mir 8 Zeichen an, also 4 Byte.
    1 char=1 Byte also verschiebe ich es immer um 4 Bit und speichere mir den darin enthaltenen Wert.
    Ja mit read hat ich es auch mal kurz versucht das klappte auch nicht,ka wieso...
    Ich probiere es nochmal.



  • daffi schrieb:

    Wie gesagt im hexeditor zeit er mir 8 Zeichen an, also 4 Byte.
    1 char=1 Byte also verschiebe ich es immer um 4 Bit und speichere mir den darin enthaltenen Wert.
    Ja mit read hat ich es auch mal kurz versucht das klappte auch nicht,ka wieso...
    Ich probiere es nochmal.

    Was auch immer du dir dabei gedacht hast, es ist falsch.



  • Sooooo,

    Ich habe es hinbekommen das die Ausgabe,sprich das cout das macht was ich will.
    Bloß wie bekomme ich diesen Wert nun auf eine Variable?
    Sprich einen 1 byte Puffer, welcher mir diesen Ausdruck speichert: cout<<hex<<(int)buffer[i];

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
        char buffer[4]={0};
    
        ifstream quelle;
        quelle.open("C:\\Users\\Daffi\\Desktop\\Bearbeiten2", ios::in | ios::binary );
        if (!quelle)                              // Fehler beim Öffnen?
            cerr << "Eingabe-Datei kann nicht geöffnet werden\n"; 
    
            quelle.read(buffer,4);
    
            for (size_t i=0;i<4;i++){
                 cout<<hex<<(int)buffer[i];
    
             }
    
        quelle.close();
        getchar();
        return 0;
    }
    


  • Probier doch mal als buffer gleich int zu nehmen. 😉



  • Sprich einen 1 byte Puffer,

    Ich dachte du wolltest 4 Byte in eine einzige Zahl umwandeln.



  • Nick Unbekannt schrieb:

    Probier doch mal als buffer gleich int zu nehmen. 😉

    Geht nicht, da read ein CHar Array Vorraussetzt.

    Ich dachte du wolltest 4 Byte in eine einzige Zahl umwandeln.

    Ja ist auch der Sinn.
    Ich hab aber lediglich hinbekommen den Hexa String überhaupt mal richtig einzulesen.

    Das Array sieht immo so aus:

    buffer: {0, 0, 4, 62}
    Soll Ergebnis ist {0, 0, 4, 3e}

    Daraus dann ein Int zu bilden ist nicht das Problem, nur dahin komme ich leider nicht!



  • daffi schrieb:

    Nick Unbekannt schrieb:

    Probier doch mal als buffer gleich int zu nehmen. 😉

    Geht nicht, da read ein CHar Array Vorraussetzt.

    Und warum castest du nicht den Zeiger? Oder wenn es unbedingt sein muss, mach eine Union:

    typedef union {
        int wert;
        char bytes[4];
    } LeseHelfer;
    
    LeseHelfer meinwert;
    read(meinwert.bytes, 4);
    cout << meinwert.wert;
    


  • Vicious Falcon schrieb:

    Endian beachten!

    Außerdem kannst du mit einem Cast immer eine beliebige (Byte-) Anzahl von Daten korrekt einlesen.



  • Nick Unbekannt schrieb:

    daffi schrieb:

    Nick Unbekannt schrieb:

    Probier doch mal als buffer gleich int zu nehmen. 😉

    Geht nicht, da read ein CHar Array Vorraussetzt.

    Und warum castest du nicht den Zeiger? Oder wenn es unbedingt sein muss, mach eine Union:

    typedef union {
        int wert;
        char bytes[4];
    } LeseHelfer;
    
    LeseHelfer meinwert;
    read(meinwert.bytes, 4);
    cout << meinwert.wert;
    

    Probiere es aus und du wirst sehen das er absoluten Mist da rein schreibt.
    Hab ich alles auch schon probiert ...

    Bei dir kommt das raus: 3e0400000 ...
    ist nicht ganz das was ich suche,dennoch danke!

    Was mich aber bei dem union noch interessiert,wo weist du der Variable wert einen Wert zu?


Log in to reply