Bits auslesen

Hallo,

ich bin gerade am Verzweifeln!

Wie frage ich ab, ob ein Bit gesetzt ist oder nicht?

Hintergrund: Ich will einen MP3 Header auslesen und suche nach dem ersten Header im File. Der startet mit 11 gesetzten bits, also suche ich nach einen byte mit dem wert 255 und gucke, ob das darauffolgende die ersten (oder letzten???) drei bits gesetzt hat. Theorie stimmt schon mal, oder?

Ich habe es auf alle möglichen Arten versucht, und mal klappt es mal nicht, mal bei diesem file, dann bei jenem… ich weiß nicht mehr weiter…

Bin dankbar für jegliche Hilfe!

Daniel

Hallo Daniel,

„mal klappt es mal nicht“ ist nur nicht eben das Paradebeispiel einer präzisen Formulierung, sodass ich auch nur recht allgemein zu antworten vermag.

Die Struktur des Headers, welche Du ja vermutlich bereits kennst, findest Du unter:

http://home.swipnet.se/grd/mp3info/frmheader/index.html

Jetzt ist noch die Frage, wie Du die Datei liest. Nach Deinen Ausführungen vermute ich, dass Du ein „file of byte“ öffnest und nun eine Schleife laufen lässt, welche die 255 sucht, und anschließend das nächste Byte testet. Wenn Du die Struktur des Headers genau anschaust, so erkennst Du, dass es beim Folgebyte auf die ERSTEN 3 Bits ankommt. Diese haben die Wertigkeiten 128, 64 und 32. Die Abfrage lautet nun

if (Folgebyte and (128 + 64 + 32 )) = (128 + 64 + 32 )

oder kurz

if Folgebyte and 224 = 224

Achtung, if (Folgebyte and 224) 0 liefert bereits true, wenn nur eines der Bits gesetzt ist!

Hilft Dir das weiter?

Gruß und schönes Wochenende
Ted

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Nachtrag mit Sourcecode
Hallo nochmal!

Hier ein kleines Beispielprogramm, welches die Frameheader in einem mp3 zählt und für einen ausgesuchten Haeder mal verdeutlicht, wie man die Informationen extrahiert.

Wahrscheinlich geht hier das Einrücken verloren, sodass das Programm etwas schwer lesbar sein wird. Musst Du mal sehen …

Gruß
Ted

program header;

type my_file = file of byte;

var bns:array[1…4] of byte;
f:my_file;
i,j,k,maske:byte;
n,ausgabe:longint;

begin
n:=0;
ausgabe:=167;
assign(f,‚xxxxxxxx.mp3‘);
reset(f);
read(f,bns[1]);
while not eof(f) do
begin
read(f,bns[2]);
if (bns[1]=255) and (bns[2] and 224 = 224)
then begin
n:=n+1;
for i:=3 to 4 do read(f,bns[i]);
if (n=ausgabe) then begin
writeln(‚Header Nr. : ‚,n);
writeln(‚AAAAAAAAAAABBCCDEEEEFFGHIIJJKLMM‘);
for j:=1 to 4 do
begin
maske:=128;
for k:=1 to 8 do
begin
if (bns[j] and maske = maske) then write(‚1‘)
else write(‚0‘);
maske:=maske div 2;
end;
end;
writeln;
if (bns[4] and 8 = 8) then writeln(‚k = 1, Audio is copyrighted.‘)
else writeln(‚k = 0, Audio is not copyrighted.‘);
end;
read(f,bns[1]);
end
else bns[1]:=bns[2];
end;
writeln(n,‘ Frameheader gefunden!‘);
close(f);
readln;
end.

Hallo,

vielen Dank für Deine Hilfe!

Ich habe da nämlich mit meiner Methode so ein seltsames Problem, dass bei einigen MP3s die ersten 11 bits NICHT alle gesetzt sind, wie sie es sein sollten, und deshalb habe ich immer wieder Synchronisationsprobleme.

Bei dem Code von Dir tritt das Problem m.E. nicht auf, dann werde ich den wohl irgendwie übernehmen.

Daniel