Binärdatei im Zweierkomplement einlesen(Vorzeichen-Problem)



  • Hallo!

    Ich hoffe mal, ihr könnt mir helfen. Ich muss für meine Studienarbeit eine WAV-Datei einlesen, um diese dann weiter verarbeiten zu können. Im Moment scheiter ich allerdings noch an den Format in dem die Samples in der Datei stehn. Bis jetzt hab ich folgendes versucht:

    void datenlesen(long start,long samples,const char *datei,long *data, long aufloesung){
    
    std::ifstream dat; //Stream Definieren
    dat.open(datei, std::ios::in|std::ios::binary); //Datei öffnen
    if (!dat) { //existiert die Datei?
            std::cout << "Fehler beim Öffnen der Datei!" <<std::endl;
            exit(2);
            }
    
    dat.seekg(start,std::ios::beg);
        int i;
        for (i=0;i<samples;i++){   // Genügend Daten für die FFT einlesen
        data[i]=0;
        dat.read(reinterpret_cast<char*>(&data[i]),aufloesung);
        }
    dat.close();
    return;
    }
    

    Prinzipiell liest er die Werte schon ein, allerdings interpretiert er jedes Sample als positiven Wert. Soweit ich das bis jetzt recherchieren konnte, stehen die Werte als 24-Bit-Zweierkomplement(Little Endian-codiert) im Wav-file. Gibts es eine Standardmöglichkeit, solche Werte richtig auszulesen, oder muss ich die nachträglich noch umwandeln(Kann ich grad nicht glauben)?
    Danke für eure Mühe!



  • data ist ein Zeiger auf ein Array von mindestens sample longs!?
    Und aufloesung ist was? 3? Und ein long ist wie groß? Im Rest stehen dann Nullen und das wird in little-endian wie interpretiert? :p

    Und die Konvertierungen der Endianess müsstest du selbst machen... aber das ist recht einfach, da dein System wohl auch Little-Endian ist 😃
    (Aber auch sonst wäre das bytes-tauschen nicht so wild.)



  • Öhmm...ja, genau...da hätte man auch selbst mal drauf kommen können. Naja, die alte Sache mit dem Wald und den Bäumen. Danke!


Anmelden zum Antworten