Die ersten 32Bit einer File auslesen
-
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. ]
-
und bei mir kommt dann, das programm auf deine dreierbeziehung angewandt,
raus:
Bit 0: 1
Bit 1: 1
Bit 2: 1
Bit 3: 1
Bit 4: 1
Bit 5: 1
Bit 6: 1
Bit 7: 1
Bit 8: 0
Bit 9: 1
Bit 10: 0
Bit 11: 1
Bit 12: 1
Bit 13: 1
Bit 14: 1
Bit 15: 1
Bit 16: 0
Bit 17: 0
Bit 18: 0
Bit 19: 0
Bit 20: 1
Bit 21: 0
Bit 22: 0
Bit 23: 1
Bit 24: 0
Bit 25: 0
Bit 26: 0
Bit 27: 0
Bit 28: 0
Bit 29: 0
Bit 30: 1
Bit 31: 0
-
@Noesis
Bringt nix, hab auf Seite 1 schon ein std::bitset vorgeschlagen aber die kaspern lieber mit char-Arrays rum
-
Original erstellt von MaSTaH:
@Noesis
Bringt nix, hab auf Seite 1 schon ein std::bitset vorgeschlagen aber die kaspern lieber mit char-Arrays rumEs geht natürlich immer schwieriger
@Peter Piksa wenn du unbeding ein char array haben willst mach doch ne schleife à la
-
@Noesis:
Mir ist im Endeffekt egal wie ich es mache. Ob nun mit char oder mit Bitset. Wichtig sind für mich zweierlei Dinge.
Zum einen dass der code die richtigen Werte ausgibt und zum anderen dass ich auch verstehe was da passiert. immerhin will ich ja etwas bei der sache lernen.Leider scheitert es aber schon beim korrekten einlesen der Daten.
Die Werte, die da vorhin aufgelistet wurden, kommen bei mir auch raus aber die stimmen leider nicht Auch nicht wenn man sie rückwärts liest.
Die File hat keine Emphasis. also müssten die ersten beiden bits "0" stehen.
ergebnis ist aber "1 und 1" demzufolge wäre Emphasis auf "CCIT J.17". (was auch immer CCIT J.17 ist)
-
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 0000d.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]@MaSTaHNöööööööö, 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 SchlawinerMir 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?