Die ersten 32Bit einer File auslesen



  • Hallo.

    Ich habe vor mit drei Partnern ein kleines Mp3-Tool zu schreiben.
    Ich habe mich über den Aufbau einer Mp3 ein bisschen Informiert und rausgefunden dass in den ersten 32 Bit jeder Mp3 sich der FileHeader befindet, der Informationen darüber liefert wie die Bitrage/Frequenz/ChannelMode etc sind.

    Nun will ich mir halt einfach mal die 32 ersten Bits einer Mp3 ausgeben lassen in einem billigen Dos Promt und mal mit meinen Informationen vergleichen. (Also ob ich da auf die selbe Bitrate komme wenn ich nachrechne etc)

    Aber wie mach ich das???
    Ich habe gestern nacht schon das ganze in ein int array[32] einzulesen mit gets, fscanf und glaub auch fread - aber das wollte einfach nicht laufen 😞

    Was mache ich nur falsch? 😞



  • du musst die bits alle "von hand" decodieren.
    z.b. die bits 12 und 13 stehen fuer die mpeg
    version, 11 version 1, 10 version 2, 00 version 2.5.
    schau dir auch mal: http://www.dv.co.yu/mpgscript/mpeghdr.htm
    an



  • Diese Informationen habe ich schon von hier http://home.swipnet.se/grd/ trotzdem Danke. Mein Problem liegt jetzt aber darin die betreffenden 32Bit überhaupt aus der Mp3File auszulesen. Wenn ich die nämlich erstmal habe, kann ich die in ein Array[32] packen und dann mit ein paar Methoden meine Informationen errechnen. 🙂

    [ Dieser Beitrag wurde am 22.03.2003 um 12:13 Uhr von Peter Piksa editiert. ]



  • mit einem array[32] belegst du deutlich mehr Speicher als 32 Bit. Je nach Typ werden mindestens 32 Byte (char) belegt. Ein einzelner long int sind 32 Bit. Also eben die ersten 32 Bit in einen long int laden und mit & und << einzelne Bits lesen.



  • @Phobos: Verstehe ich noch nicht so ganz. Für mein Verständnis heisst es dass ich einfach nur die 32 ersten Zahlen aus der File auslesen muss, oder nicht?



  • Lad dir in einen 32-Bit Datentyp (unsigned long o.ä.) die Ersten 4 Bytes (32 Bit) rein und prüfe dann mit << (Shift) und & die einzelnen Bits ab oder verwende ein std::bitset (einfacher)

    [ Dieser Beitrag wurde am 22.03.2003 um 12:59 Uhr von MaSTaH editiert. ]



  • @MaSTaH: Ich habe mit diesem Linksshift Operator noch nie gearbeitet und ich weis auch nicht was er übrhaupt macht. Könntest du vielleicht mal ein paar Zeilen Beispielcode schreiben?



  • direkt auslesen kannst du dein array nicht.
    dort sind bestimmte bits gesetzt.
    liesst du es normal aus kommt nur daten-muell raus.

    du solltest die informationen besser in ein char array
    lesen, das ist einfacher zu handhaben.

    also du musst schauen ob ein bestimmtes bit gesetzt ist.
    willst du wissen ob z.b. das 12. bit gesetzt ist musst du
    folgendes machen:

    int maske = 1;
    /* mit maske << 12 wird die 1 um zwoelf
    * stellen nach links geschoben
    * das einfache & verknuepft den wert
    * des arrays mit der maske
    /
    if ( ( array[0] & ( maske << 12 ) ) == ( maske << 12 ) )
    {
    /* 12. bit ist "1"
    /
    }
    else
    {
    /* 12. bit ist "0" */
    }

    [ Dieser Beitrag wurde am 22.03.2003 um 13:39 Uhr von entelechie editiert. ]



  • *Hab hier grad was gelöscht* - hat sich erledigt. *g*

    [ Dieser Beitrag wurde am 22.03.2003 um 23:19 Uhr von Peter Piksa editiert. ]



  • Original erstellt von Peter Piksa:
    [QB]*Hab hier grad was gelöscht* - hat sich erledigt. *g*[QB]



  • *Hab hier grad was gelöscht* - hat sich erledigt. *g*



  • Original erstellt von entelechie:
    **direkt auslesen kannst du dein array nicht.
    dort sind bestimmte bits gesetzt.
    liesst du es normal aus kommt nur daten-muell raus.
    **

    ahm...na wie lese ich denn nun aus?
    Ich stelle mir da sowas in der Art vor:

    int main(void)
    {
    char b[32];
    
        FILE * FilePointer;
        FilePointer = fopen("13 - Gutted.mp3","r");
        fgets( &b[0], 32, FilePointer );
        fclose(FilePointer);
    
        return(0);
    }
    

    [ Dieser Beitrag wurde am 22.03.2003 um 23:36 Uhr von Peter Piksa editiert. ]



  • Original erstellt von Peter Piksa:
    @MaSTaH: Ich habe mit diesem Linksshift Operator noch nie gearbeitet und ich weis auch nicht was er übrhaupt macht. Könntest du vielleicht mal ein paar Zeilen Beispielcode schreiben?

    Der schiebt eigentlich nur die Bits rum:
    z.B.
    00010001 << 1 = 00100010

    Er wird beim Bits auslesen nur zum Berechnen von Zweierpotenzen gebraucht.

    if(val & (1 << 64)) // <- prüft ob das siebte Bit gesetzt ist (64er-Bit)
      bit7 = true;
    

    Aber mit einem Bitset ist es einfacher:

    unsigned int test = 12345; // unsigned int hat auf Windows 9x/ME/NT/2k/XP 32 Bit
    bitset<32> bits(test);
    bool b128 = bits.at(7); // b128 erhält den Wert von Bit 7
    


  • Original erstellt von Peter Piksa:
    **ahm...na wie lese ich denn nun aus?
    Ich stelle mir da sowas in der Art vor:

    int main(void)
    {
    char b[32];
        
        FILE * FilePointer;
        FilePointer = fopen("13 - Gutted.mp3","r");
        fgets( &b[0], 32, FilePointer );
        fclose(FilePointer);
        
        return(0);
    }
    

    [ Dieser Beitrag wurde am 22.03.2003 um 23:36 Uhr von [qb]Peter Piksa** editiert. ][/QB]



  • tut mir leid aber opera speichert nicht die sachen, wenn man versehentlich auf zurück klickt. deshalb ist mein ganzer shcöner text FUTSCH!!!!

    naja eine frage an peter piksa: weißt du das ein byte aus acht bits besteht?
    weißt du, das ein bit nur zwei zustände annehmen kann?



  • @Waaaaah: Ja klar 8Bit == 1Byte ist logisch. Ein Bit kennt die Zustände 1/0 auch klar *g* 😉



  • @Mastah: Ich denke es ist ratsam wenn ich dich erstmal frage ob ich die daten denn überhaupt richtig einlese bevor ich mich haareraufend mit dem Linksshiftoperator prügeln werde.....ist der code ok? (muss ich die file nicht vielleicht mit rb (readbinary) öffnen?)

    #include <iostream.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
    long int b[32];
    
        FILE * FilePointer;
        FilePointer = fopen("13 - Gutted.mp3","r");
        fgets( &b[0], 32, FilePointer );
        fclose(FilePointer);
    
        return(0);
    }
    


  • richtig, ein byte hat acht bit und ein bit ist entweder 0 oder 1

    ein long int hat aber mehr als ein byte (4 typischerweise).
    und du machst ein array von 32 longs?
    also machst du platz für 32*4 byte = 32*4*8 bits. soviel willst du aber nicht, oder?
    also nimm entweder ein long oder 4 char etc.

    long l;
    fgets (&l, 4, fptr);
    

    vorrausgesetzt long hat 4 bytes mindestens

    und jetzt hast du in dem integer eine bitfolge, die ca. so aussieht
    11010101101011101000101010101110
    und das kannst du in ein bitset reinquetschen, wie mastah schon beschrieben hat

    du kannst dir aber auch
    so was machen:

    struct mp3header {
        int version : 4; //4 die ersten 4 bit für die version
        int blub : 28; //die nächsten 28 für blub
        /*etc*/
    };
    

    und dann (mit etwas glück) direkt in ein mp3header x; fgets((char*)x, 4, blub);
    hineinschreiben



  • was nösis sagt, stimmt !!!



  • das letzte mit den bitfeldern war aber nicht mehr ganz ernst gemeint 😉


Anmelden zum Antworten