Die ersten 32Bit einer File auslesen



  • 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



  • @entelechie:
    Nein wir sprechen nicht aneinander vorbei!
    Du hast mein Problem genau erkannt.
    Ich denke ich komme der Lösung immer näher und näher, nur bisher hatte ich noch nicht den Durchbruch *g*

    Gehen wir das mal Systematisch durch:

    + Du sagst ich muss die Datei so einlesen

    f = fopen( "datei.mp3", "rb" );
    fread( puffer, 1, 4, f );
    

    so weit so gut. Aber welchen Datentyp hat denn Puffer?

    ========================================================

    + Anschliessend sagst du:
    jetzt steht in puffer[0] -> 0001 1110

    Soll ich nun also ein Feld von Puffer machen oder nicht? Und wenn ja wie gross soll es denn sein? 4?

    ========================================================

    Anschliessend habe ich also eine Zeichenfolge gespeichert, die in etwa so aussieht:

    0110 0000 1111 0101 1010 0011 1111 0001
    right?
    Und mit dieser Information kann ich nun erkennen ob meine Mp3 copyrighted ist oder nicht etc?

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



  • puffer ist ein char feld.
    ein char ist genau 8 bit gross (jaja es gibt auch
    andere architekturen...).
    du willst 32 bit einlesen das bedeutet du brauchst
    aaaaehh... 4 byte also hat das feld die groesse 4 :).
    du musst jetzt natuerlich alle bits einzeln abklopfen
    und die informationen gemaess den mp3 spezifikationen
    raussaugen.
    so kodieren also z.b. die bits 12 und 13 ("B") die
    mpeg version, dass siehst du ja in der tabelle von dem
    link.



  • Hi Peter Piksa

    wenn Du's nach entelechie machst, brauchst Du ei Puffer fuer 4 Byte's,
    z.B.:
    unsigned char Puffer[4];

    gespeichert wird die Auswertung NICHT. entelechie hat dir das Prinzip der Auswertung bitweise erklaert! (am Beispiel 30.Bit)

    Haste meinen Beitrag nicht gelesen??? 🕶

    Da werden:

    die ersten 4 Byte = 32 Bit in eine Variable 'First32Bit' eingelesen,
      die 32 Bit nacheinander getestet
      die Testergebnisse GESPEICHERT in eine 'ZeichenKetten'- Variable 'Bits'
    
    in 'Bits' steht danach GESPEICHERT die Belegung der ersten 32 Bit der Datei
    
    Als Dateiname muss natuerlich die Datei angegeben werden, die Du testen willst!!! Ich hab's halt mit 'ner BMP- Datei gemacht, ist aber im Prizip egal.
    


  • @DerAltenburger:

    Hi Altenburger! 🙂
    Ich habe grade als du deinen Beitrag geschrieben hast etwas vorbereitet.
    Ich habe mal eine Mp3 (184Kbte gross) auf einen Server zum Download gepackt.
    Genau diese Mp3 habe ich mit deinem Code getestet und mir die werte ausgeben lasen. Dann habe ich die ergebnisse mit den Informationen aus denen von Winamp verglichen (da kommt so ein fenster auf wenn man eine mp3 in die playlist einliest und dann auf file info klickt).

    Der Code von dir gibt an dass die ersten beiden Bits 0 und 1 sind.
    Demzufolge gilt:
    Emphasis:
    00 - none
    01 - 50/15 ms
    10 - reserved
    11 - CCIT J.17

    Also hätte die Mp3 50/15 ms Emphasis.
    Winamp sagt aber: Emphasis: none

    Irgendwas passt da nicht *stirnrunzel* 😞

    Hier kann man die Mp3 runterladen und mal testen.
    Wäre echt megaklasse wenn wir das problem gemeinsam lösen könnten!!!
    [url] http://peter.pbartels.info/Dreierbeziehung.mp3 [/url]

    [ Dieser Beitrag wurde am 24.03.2003 um 18:09 Uhr von Peter Piksa editiert. ]



  • Hi Peter Piksa

    Was die 32 Bit im MP3- Format bedeuten, weis ich nicht!

    Das Demo soll Dir nur zeigen, wie die Bits gelesen und getestet werden!

    Bei der Auswertung von 'Bits' musst Du beachten in welcher Reihenfolge die 'reingespeichert sind.

    -- Ich Teste alle 32 Bit als eine Einheit!!!
    -- Das hoechste der 32 Bit steht am Anfang in 'Bits'!!!

    Sind die Angaben im MP3- Format Byteweise, Wordweise oder als Doppelword (alle 4Byte zusammen) gemeint? Eventuell musst Du den charvector in Achtergruppen auswerten - entspricht Byteweise!!!



  • Original erstellt von Shade Of Mine:
    **[quote]Original erstellt von Noesis:
    [qb]ein byte hat acht bit
    **

    äh, sorry. das stimmt aber nicht immer...[/QB][/QUOTE]

    wollt extra noch "typischerweise" dazuschreiben 😕 hab ich wohl vergessen :p



  • @DerAltenburger:

    Was die 32Bit für eine Bedeutung haben, steht hier beschrieben: http://home.swipnet.se/grd/mp3info/frmheader/index.html
    Das ist die Grundlage meiner Arbeit.

    Was meinst du nur mit: "Das hoechste der 32 Bit steht am Anfang in 'Bits'!!!" ???



  • Das haengt mit der Reihenfolge der Bytes im Speicher / in der Datei zusammen!

    Durch das lesen der ersten 4 Byte als EINE Einheit (4 Byte- Variable), ergibt sich folgendes:

    die ersten 8 Zeichen in 'Bits' entsprechen dem 4. Byte der Datei
    .
    .
    die letzten 8 Zeichen in 'Bits' entsprechen dem 1. Byte der Datei!!!

    Das erste Byte in Deiner Datei ist 0FF hex = 11111111 bin

    PS: Du must die Bits in 'Bits' genau anders'rum auswerten!!!

    in 'Bits' stehen die: 31. Bit 30. Bit ........0. Bit!!!

    [ Dieser Beitrag wurde am 24.03.2003 um 18:33 Uhr von DerAltenburger editiert. ]

    [ Dieser Beitrag wurde am 24.03.2003 um 18:36 Uhr von DerAltenburger editiert. ]



  • Ja ok aber auch wenn ich die Reihenfolge eben umdrehe, also mir die beiden letzten bits eben ausgeben lasse,

    cout << Bits[31] << endl;
    cout << Bits[30] << endl;
    

    kommt bei der Mp3 "Dreierbeziehung.mp3" "1 und 1" raus. winamp sagt aber "0 und 0" 😞 *schnief*



  • #include <bitset>
    #include <fstream>
    #include <iostream>
    using namespace std;
    
    int main () {
         unsigned int buff; //u. int sollte 32 bit haben (notfalls in compiler-doku nachschauen!)
         ifstream fin("bla.mp3", ios::binary);
         fin.read (reinterpret_cast<char*>(&buff), 4);
    
         bitset<32> bits(buff);
         cout << "Bit Nummer 0 = " << bits[0] << '\n';
    }
    

    [ Dieser Beitrag wurde am 24.03.2003 um 19:08 Uhr von Noesis editiert. ]


Anmelden zum Antworten