Die ersten 32Bit einer File auslesen



  • @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 😉



  • Original erstellt von Noesis:
    **ein byte hat acht bit
    **

    äh, sorry. das stimmt aber nicht immer...
    nicht umsonst wird im c++ standard extra geschrieben dass byte die kleinste einheit ist - und aus wievielen bits ein byte besteht ist nirgendwo definiert (nur für jede hardware)

    es gibt also auch hardware wo ein byte zb 16 bit hat



  • @Peter Piksa

    Versuch doch mal das:

    . 
        . 
        . 
        long int First32Bit;                        //Speicher fuer 32 Bit=4 Byte
        char Bits[33];                              //Char- Vektor fuer Bit- Zustand
        FILE * FilePointer;
        FilePointer = fopen("c:\\Angler.bmp","rb"); //Binaer oeffnen!!!
        fread(&First32Bit,1,4,FilePointer );        //Block- Lesen!!!(Binaerdatei)
        fclose(FilePointer);
        for (int i=0;i<32;i++)                      //Alle 32 Bits durchgehen
        {
          if ((First32Bit&(1<<i))>0)                //1 << i: 1,2,4,8,...2^(i-1)
            Bits[31-i]='1';                         //Charvektor von hinten belegen
          else
            Bits[31-i]='0';
        }
        Bits[32]=0;                                 //charvektor abschliessen
        . 
        . 
        .
    

    Danach stehen die Bit- Zustaende im char- Vektor. Hoechstes Bit zuerst!!!
    Voila, das kannste beliebig auswerten! :p



  • peter vielleicht reden wir aneinander vorbei, ich weiss
    nicht.
    ich habe dich so verstanden, dass du mit einem c programm
    informationen zu mp3s ermitteln willst.
    falls ja schau dir noch mal meinen 2. beitrag an, da hab
    ich erklaert wie du pruefen kannst, ob ein bestimmtes bit
    gesetzt ist.
    jetzt stell dir mal den mp3 header vor:
    0001 1110 0110 1000 0101 0001 1110 0110
    das ist jetzt mal eine willkuerliche folge von 0 und 1.
    das liesst du mit:
    f = fopen( "datei.mp3", "rb" );
    fread( puffer, 1, 4, f );
    ein.
    jetzt steht in puffer[0] -> 0001 1110
    ...
    puffer[3] -> 1110 0110

    soweit so gut. jetzt willst du wissen, ob das ding ein
    copyright besitzt oder nicht (mal als beispiel).
    laut der definition ist das das 30. bit (in der doku deiner
    seite das "L"); also steht es in puffer[3] an stelle 6.
    dazu folgender code:

    int maske = 1;
    /* shiften der 1 um 5 stellen, damit wird die
     * 1 an die 6. stelle geschoben
     */
    if ( puffer[3] & ( maske << 5 ) == ( maske << 5 ) )
    /* ja copyright */
      printf( "copyright" );
    else
    /* nein kein copyright */
      printf( "kein copyright" );
    


  • Original erstellt von <nösis>:
    das letzte mit den bitfeldern war aber nicht mehr ganz ernst gemeint 😉

    Ne, wieso? Er hat nur ein & vor dem x vergessen


Anmelden zum Antworten