Die ersten 32Bit einer File auslesen



  • Hi Peter Piksa

    Also in Deiner Datei stehen die ersten 4 Byte so:

    1.Byte 2.Byte 3.Byte 4.Byte
    0xff 0xfa 0x90 0x40 (hex)

    1111 1111
    1111 1010
    1001 0000
    0100 0000

    d.h. Durch das lesen aller 4Byte als Einheit stehen dit Bits in Achtergruppen genau in falscher Reihenfolge!!!

    Man muss die Bytes doch einzeln (Byteweise) lesen.



  • Hi Peter Piksa

    Aender mal das lesen so:

    for (int j=0;j<4;j++)                     //4 Bytes
        {
          fread(&First4x8Bit,1,1,FilePointer );   //Block- Lesen!!!(Binaerdatei)
          for (int i=0;i<8;i++)                   //Alle 8 Bits durchgehen
          {
            if ((First4x8Bit&(1<<i))>0)           
              Bits[i+24-8*j]='1';                 //Charvektor belegen
            else
              Bits[i+24-8*j]='0';
          }
        }
    

    Dann stehen die Bits so sie Du die brauchst!

    "00000010000010010101111111111111\0" in 'Bits'

    PS: unsigned char First4x8Bit; //kleinerer Datentyp!

    [ Dieser Beitrag wurde am 24.03.2003 um 19:44 Uhr von DerAltenburger editiert. ]

    [ Dieser Beitrag wurde am 24.03.2003 um 19:47 Uhr von DerAltenburger editiert. ]



  • @DerAltenburger
    Brrr, ist deine Leertaste kaputt???



  • @MaSTaH

    Nöööööööö, so stehen die Bits nun mal d'rin (alle hintereinanderwegwieichsgeschriebenhab) 😃

    @Peter Piska

    Geht's so???



  • 🙂 🙂 🙂 🙂 ES LÄUFT!! ES LÄUFT!!!! *FreuWienSchnitzel!!!!* 🙂 🙂 🙂 🙂

    Danke Altenburger!!!!!!
    Ich habe die Werte verglichen und es läuft tatsächlich!! woooah wie geil! *g*
    Jetzt werd ich mir nurnochmal ansehen was genau da passiert in dem code!

    #include <iostream>
    using namespace std;
    
    int main () {
    
        long int First4x8Bit;                        //Speicher fuer 32 Bit=4 Byte
        char Bits[33];                              //Char- Vektor fuer Bit- Zustand
        FILE * FilePointer;
        FilePointer = fopen("Dreierbeziehung.mp3","rb"); //Binaer oeffnen!!!
           for (int j=0;j<4;j++)                     //4 Bytes
        {
          fread(&First4x8Bit,1,1,FilePointer );   //Block- Lesen!!!(Binaerdatei)
          for (int i=0;i<8;i++)                   //Alle 8 Bits durchgehen
          {
            if ((First4x8Bit&(1<<i))>0)           
              Bits[i+24-8*j]='1';                 //Charvektor belegen
            else
              Bits[i+24-8*j]='0';
          }
        }
        fclose(FilePointer);
    
         for (int i=0 ; i<32; i++)
         { cout << "Bit " << i << ": " << Bits[i] << endl; }
    
        if (Bits[6] == '0' && Bits[0] == '0')
             cout << "Datei ist Stereo!" << endl;
        if (Bits[6] == '1' && Bits[7] == '0')
             cout << "Datei ist Joint Stereo!" << endl;
        if (Bits[6] == '0' && Bits[7] == '1')
             cout << "Datei ist Dual Channel!" << endl;
        if (Bits[6] == '1' && Bits[7] == '1')
             cout << "Datei ist Mono!" << endl;
    
        if (Bits[0] == '0' && Bits[0] == '0')
             cout << "Emphasis: None" << endl;
        if (Bits[0] == '1' && Bits[1] == '0')
             cout << "Emphasis: 50/15 ms" << endl;
        if (Bits[1] == '1' && Bits[0] == '0')
             cout << "Emphasis: Reserved" << endl;
        if (Bits[1] == '1' && Bits[1] == '1')
             cout << "Emphasis: CCIT J.17" << endl;
    
         return(0);
    }
    

    Auf jeden fall schonmal eine super-dickes Dankeschön an euch alle!!!

    [ Dieser Beitrag wurde am 24.03.2003 um 20:10 Uhr von Peter Piksa editiert. ]

    [ Dieser Beitrag wurde am 24.03.2003 um 20:25 Uhr von Peter Piksa editiert. ]



  • Original erstellt von DerAltenburger:
    [QB]@MaSTaH

    Nöööööööö, so stehen die Bits nun mal d'rin (alle hintereinanderwegwieichsgeschriebenhab) 😃
    QB]

    Nein ich mein deinen Code... Hättest zwecks besserer Lesbarkeit auch mal ein Leerzeichen spendieren können.... Aber was du kannst das kann ich schon lange:

    bool f=~((y?123%18:987/12*21-3)%5<9)?a:!b;
    

    😃 übertreib

    [ Dieser Beitrag wurde am 24.03.2003 um 20:27 Uhr von MaSTaH editiert. ]



  • @MaSTaH

    Ach s o o o o o o o o o o o o h h h h h .

    Den Sch***, ähm Code soll doch keiner lese, der ist doch fuern Compiler! 😃

    PS: Hast ja Recht, aber ich bin so faul!!!



  • Original erstellt von DerAltenburger:
    Den Sch
    *, ähm Code...**

    Aaaay... 😞 Der Code erfüllt einen guten Zweck! *g*
    Der ist niemalsnicht shice! :p



  • He Peter,

    Damit war mein Code gemeint! :p 😉 🕶

    PS: Es ging um die Lesbarkeit! Den Zweck soll er ja erfuellen.
    Nur MaSTaH solls nicht lesen koennen (Hihihi)

    [ Dieser Beitrag wurde am 24.03.2003 um 20:45 Uhr von DerAltenburger editiert. ]



  • @DerAltenburger:
    *grins* Du Schlawiner 🙂

    Mir ist grade aufgefallen dass Winamp bei der File Info angibt wo sich der Header befindet. Ich habe hier eine Mp3 bei der steht: "Header found at: 792 bytes"...wie kann ich denn dem Programm sagen dass er ab dieser stelle die 4x8Bit (=4Byte,32Bit) ausliest?



  • nochne kleinigkeit: du hast pro bit ein char (speicherverschwendung? ok, hält sich [noch] in grenzen), also brauchst du 32 chars.
    aber da steht
    char bla[33];



  • @Noesis: Ja stimmt. Danke dass du mich drauf hingewiesen hast. 🙂
    Ich hab aus dem char eben ein short int gemacht 🙂
    Hast du vielleicht ne Idee wie ich herausfinden kann an welcher Position in einer Mp3 sich der Header befindet?



  • @Peter Piksa

    Wenn Du eine Datei ab einer bestimmten Stelle lesen willst, muss nach oeffnen und VOR erstem lesen

    fseek(....) oder fsetpos(....) benutzt werden. Schau Dir mal die Funktionen in der Hilfe an!!! 😉

    @Noesis

    Die 33 charsbilden eine 'String', das 33. Byte ist das Schluss- Zeichen '\0'
    (Damit kann das Teil als Text angesprochen werden!!!)

    Die Verschwendung war Absicht!!! - Damit sollte der Bit- Zustand 'direkter' ansprechbar werden ohne Shiften!

    @Peter Piksa

    Das mit dem Shortint statt char wurde ich nicht machen!
    char = 1 Byte
    short int = 2 Byte
    int = 2 o. 4 Byte
    long int = 4 Byte

    D.h.: mit short int brauchst Du doppelt so viele Bytes!
    😃



  • Original erstellt von DerAltenburger:
    Nur MaSTaH solls nicht lesen koennen (Hihihi)

    Naja, ich hab schon schlimmeres gesehen 😃



  • Original erstellt von Peter Piksa:
    @Noesis: Ja stimmt. Danke dass du mich drauf hingewiesen hast. 🙂
    Ich hab aus dem char eben ein short int gemacht 🙂
    Hast du vielleicht ne Idee wie ich herausfinden kann an welcher Position in einer Mp3 sich der Header befindet?

    nimm am besten long double dann spart es noch mehr Platz 😃 . Ne mal im Ernst, in den MSDN gibts ne ganz gute Tabelle mit den einzelnen Datentypen. Lohnt sich mal da reinzugucken...

    Kannst dir ja auch ne struct machen die nur ein Bit speichert 😃 *lol*

    struct bit{
      unsigned val:1;
    };
    

    Bringt aber nix...

    Ein Bitset benutzt auch bool und das hat auch 8 Bit, also genau wie char... Die "resourcenschonendste" Lösung (und nervenaufreibenste dazu) ist mit << und & die Bits auszulesen...

    [ Dieser Beitrag wurde am 25.03.2003 um 13:18 Uhr von MaSTaH editiert. ]



  • Um noch mal auf das Aufspüren des Headers zurückzukommen.

    Ich habe mich in einem Forum angemeldet, wo leute sich speziell nur über Soundformate wie MP3, ogg-Vorbis und Konsorten unterhalten. Als ich dort die Frage stellte wie ich den Header aufspüren kann, erhielt ich folgende Antwort:

    It is very easy to locate the sync-block of the header. It consists of 11 set bits. So just serach for 0xFF, it you found it, check if the next byte have the first 3 bits set (byte&0xE0 == 0xE0), if yes you found it.

    Ich kann dem Autor leider nicht so ganz folgen.
    Die 11 gesetzen Bits treten bei mir am ende auf. Die Finde ich bei mir. Das passt also. Aber was er dann anschliessend versucht zu erklären, dass ist für mich nicht so ganz verständlich. Stellt dieses 0xFF meine 11 Bits dar? Wenn diese 11 Bits am ende der 32Bit liegen, dann muesste ich ja nur 21Bit zurückspringen und wäre somit am anfang. Verstehe ich das korrekt?



  • 0xFF stellt 8 gesetzte bit dar: 11111111
    der block beginnt dort, wo 11 bits nacheinander gesetzt sind. also fehlen noch drei

    11111111 111XXXXX
       |         |
     1.Byte    2.Byte
    

    Also suchst du ein byte mit 0xFF und das zweite muss die ersten drei bits gesetzt haben (byte2 & 0xE0 == 0xE0, denn 0xE0 == 11100000)



  • Genau so, wie der Erklaerer das erklaert, muste das machen!!! 😃

    1. Datei oefnen;
    2. solange (wiederholt) 1 Byte lesen
    3. Inhalt == 0xff ??? testen
    -- wenn ja
    -- -- noch ein Byte lesen
    -- -- ((Inhal & 0xe0)>0) testen //
    -- -- wenn ja : HEADER gefunden!!! (Die 2 letzten Bytegehoeren dazu!!!
    -- -- -- noch 2Byte lesen: (Die gefundenen 2 Byte + die 2 neu gelesenen
    -- -- -- sind der Header (Auswerteung haben wir schon gemacht!
    -- -- sonst :bei 2. weitermachen (wiederholt) //war nicht der Header
    -- sonst: bei 2. weitermachen (wiederholt) //war nicht der Header



  • nur am Rande: ich nannte mich "erkärer" nicht "Erklärer" 🙄



  • @DerAltenburger:
    Ok, das Prinzip habe ich verstanden.
    Jetzt muss ich den Code, den ich fürs erste Einlesen verwendet habe eigentlich nur noch ein bisschen abändern, denke ich.
    Könntest du mir erklären was in diesem Quellcode an den von mir markierten stellen genau passiert?

    for (int j=0;j<4;j++)    // 4Bytes sollen gelesen werden aber immer nur eines auf ein mal, right?
    {
        fread(&First4x8Bit,1,1,FilePointer );   // In First4x8Bit wird 1Byte eingelesen?
        for (int i=0 ; i<8 ; i++)        //Alle 8 Bits durchgehen
        {
            if ((First4x8Bit&(1<<i))>0)    // Hier blicke ich absolut nicht durch :(
                Bits[i + 24 - 8 * j] = 1;   // Hier auch nicht
            else
                Bits[i + 24 - 8 * j] = 0;   // Demzufolge auch hier nicht
        }
    }
    

    [ Dieser Beitrag wurde am 26.03.2003 um 21:26 Uhr von Peter Piksa editiert. ]


Anmelden zum Antworten