Mehrere Bytes zusammenfassen



  • Hallo
    Erstmal muss ich sagen, dass ich wenig Programmiererfahrung habe und es super wäre wenn ihr eure Antwort für mich verständlich schreibt 🙂

    Ich habe folgendes Problem: Ich lese eine Datei ein und bekomme dann mit fgetc Byte für Byte aus der Datei (es handelt sich um eine MIDI Datei also eine Aneinanderreihung von vielen Bytes in Hexadezimaler schreibweise)

    Eine Byte folge die ich einlese könnte also folgendermaßen aussehen: 4D 54 68 64 00 00 00 06 00 01 00 02 01 E0

    Das ganze wird automatisch in dezimale Werte umgeschrieben und ich weiss auch wie ich das wieder hexadezimal ausgeben kann.

    Allerdings will ich manche Bytes zusammenfassen 01 E0 zB soll dann die Zahl 0x01E0 -> 480 ergeben.
    Wie kann ich nun mehrere Bytes zusammenfassen und als eine Zahl ausgeben?

    Vielen Dank schonmal.

    Gruß Zaus



  • kannst du nicht einfach 0x01*256+0xE0 rechnen?

    mfg Luis



  • Ja klar so hab ich das bis jetzt auch gelöst aber das gefällt mir so nicht 😉
    Dachte da gibt es vielleicht eine elegantere Lösung.



  • achso 😃 ja nee sonst fällt mir da auch nix ein warten wa ma lieber ob wer anders ne idee hat

    mfg Luis



  • Jo mal schaun, trotzdem danke 👍



  • #include <climits>
    
    int main()
    {
    	unsigned char a = 0x01;
    	unsigned char b = 0xE0;
    
    	unsigned short ab = (a << CHAR_BIT) | b; // 0x01E0
    }
    


  • Hey danke. Da hab ich aber gleich noch n paar Fragen. Ich hab das eigentlich so gemacht, dass die zeichen die ich eingelesen habe direkt in integer umgewandelt wurden. Damit hab ich jetzt erstens das Problem, dass die Hexadezimalzahlen als int und nicht als char vorliegen.

    Außerdem ist mir gerade aufgefallen, dass ich das einlesen in C und nicht C++ programmiert habe. Jetzt will ich das aber schon richtig machen aber bekomme es leider nicht richtig hin.

    Bisher hab ich das folgendermaßen gehabt:

    FILE *stream;
    stream = fopen("D:\\bla.mid", "rb");   
    	if (stream == NULL)
    	{
    		printf("Error, kein File gefunden");
    	}
    int ch;
    while ((ch=fgetc(stream)) != EOF) 
    {
        cout << hex << ch << endl;
    }
    

    Nun hab ichs in "richtigem" C++ probiert aber komme nicht klar da ich entweder mit getline ganze Zeilen einlesen müsste oder wenn ich es so versuche die konvertierung nach int nicht funktioniert und buffer vom typ char sein müsste

    ifstream stream;
    string fileName = "D:\\bla.mid";
    stream.open(fileName.c_str(), ios::in|ios::binary);
    
    int buffer
    	if (!stream)
    	{
    		cerr<<"Error, kein File gefunden";
    	}
    
    	while (!stream.eof() )
    	{
    		stream.get(buffer);
    		cout << hex << buffer <<endl;					
    	}
    


  • Die Stream-Operatoren sind nur für textuelle Darstellung gedacht. Zum binären Lesen kannst du entweder die Methode 'get()' oder aber 'read()' verwenden:

    int n = stream.get();
    // oder
    char c = stream.get();
    
    // bzw.
    short zahl; // 2 Zeichen aufeinmal lesen
    stream.read(&zahl, sizeof(short));
    


  • Vielen Dank!

    int n = stream.get();
    

    funktioniert hervorragend.

    Bei

    short zahl; // 2 Zeichen aufeinmal lesen
    stream.read(&zahl, sizeof(short));
    

    bekomme ich allerdings folgende Fehlermeldung:
    error C2664: 'std::basic_istream<_Elem,_Traits>::read': Konvertierung des Parameters 1 von 'short *' in 'char *' nicht möglich



  • Sorry, so ist es richtig:

    short zahl; // 2 Zeichen aufeinmal lesen
    stream.read(reinterpret_cast<char*>(&zahl), sizeof(short));
    

    Hierbei mußt du jedoch die Endianess beachten, d.h. je nach Prozessortyp können die Bytes evtl. dann vertauscht sein (unter Intel/AMD ist es immer Little-Endian, d.h. das erste Byte ist die Zahl mit der kleineren Wertigkeit, danach dann erst die höhere, d.h. aus 0xAB 0xCD wird dann 0xCDAB).



  • Ja so gehts danke.
    Gibt es eine Möglichkeit diese Endianess umzukehren? Denn wie die 2 Zahlen so aneinadergehängt werden würde es mir nichts nützen.


Anmelden zum Antworten