Die ersten 32Bit einer File auslesen
-
@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 = 00100010Er 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 hatdu 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 0110soweit 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 gemeintNe, 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 1110Soll 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.