Binärdatei bitweise auslesen

Hallo,

ich will eine Binärdatei bitweise in C auslesen.
Zeichen für Zeichen, also byteweise klappt gut, aber um einzelne bits zu lesen finde ich keine Funktion.
Oder muss ich Zeichen für Zeichen einlesen und die einzelnen Bytes dann extra in Bits umwandeln und checken?

Wäre schön, wenn jemand das schonmal gemacht hätte und mir den Weg kurz schildern könnte.

Gruss,
jahan.

Hallo jahan,

ich will eine Binärdatei bitweise in C auslesen.
Zeichen für Zeichen, also byteweise klappt gut, aber um
einzelne bits zu lesen finde ich keine Funktion.
Oder muss ich Zeichen für Zeichen einlesen und die einzelnen
Bytes dann extra in Bits umwandeln und checken?

Wäre schön, wenn jemand das schonmal gemacht hätte und mir den
Weg kurz schildern könnte.

Für bitweises auslesen einer Datei gibt es keine Funktionen in den Standart-Bibliotheken.

char c; // ist das gelesene Byte

Variante 1:

 (c & 0x01) != 0; // Liefert TRUE/FALSE für Bit0
 (c & 0x02) != 0; // Liefert TRUE/FALSE für Bit1
 (c & 0x04) != 0; // Liefert TRUE/FALSE für Bit2
 (c & 0x08) != 0; // Liefert TRUE/FALSE für Bit3
 (c & 0x10) != 0; // Liefert TRUE/FALSE für Bit4
 (c & 0x20) != 0; // Liefert TRUE/FALSE für Bit5
 (c & 0x40) != 0; // Liefert TRUE/FALSE für Bit6
 (c & 0x80) != 0; // Liefert TRUE/FALSE für Bit7

Variante 2:

int i;
for (i=0; i
MfG Peter(TOO)

also muss ich doch zeichen für zeichen einlesen…

komisch, dass man das so selten braucht, dass es da keine funktion in den standartbibs gibt…
Ich will halt mp3 header (bitrate) auslesen und da muss ich halt eine Stelle suchen, die mit 11 Einsen anfängt…

aber danke schonmal, ich versuchs mal damit
Gruss,
jahan.

Hi Jahan.

Ich möchte jetzt nicht als Spielverderber gelten, aber warum liest du den Header Datei nicht direkt in eine Struktur?

Hier z.B. die Union fuer den MP3-Header. (leider grob aus dem Zusammenhang gerissen. Hab es mal selber in einem anderen Prog gebraucht):

typedef struct T\_MP3HEADER{
 union{
 struct{
 unsigned int byte4:8;
 unsigned int byte3:8;
 unsigned int byte2:8;
 unsigned int byte1:8;
 }e;
 struct{
 unsigned int Emphasis : 2;
 unsigned int Original : 1;
 unsigned int Copyright : 1;
 unsigned int Mode\_Ext : 2;
 unsigned int Mode : 2;
 unsigned int Private : 1;
 unsigned int Paddig : 1;
 unsigned int Samplefrq : 2;
 unsigned int Bitrate : 4;
 unsigned int Protection : 1;
 unsigned int MPEGLayer : 2;
 unsigned int MPEGVersion : 1;
 unsigned int SyncWord : 12;
 }a;
 }h;
}MP3HEADER;

Du liest die Daten aus der Datei in die erste Struktur der union ein und greifst nachher über die zweite Struktur darauf zu. Dann brauchst du nicht so sehr mit den Bits rumhantieren.

Wenn du willst kann ich dir auch noch den Restlichen Sourcecode zum einlesen schicken (der allerdings irgendwo in meinem Proggi verstrickt ist…)

Gruss Jens

hallo jens

danke für die antwort, aber ich bin leider schon fertig :smile:

was bedeuten die ‚:‘ teile aus deiner message? wie hier : 2?
unsigned int Emphasis : 2;

gruss jahan.

hallo jens,

ja krass, hab jetzt mal verstanden was du da machst.
hatte ich noch nie gesehen und sogar auch nicht in der c-vorlesung gehabt :frowning:((
spart mir aber ne menge quellcode, wenn ichs so mache wie du es vorgeschlagen hast :smile:

gruss, jahan.