Schreiben von Bits in eine Datei in C

Lesezeit: 3 Minuten

Ich habe diesen String: “101” Ich möchte ihn in eine Datei schreiben, in C, nicht als Text: “101” und so 8 Bits x Zeichen. Verwenden Sie die Zeichenfolge jedoch direkt als Bits: das Bit “1”, das Bit “0” und das Bit “1”, sodass die Datei aus 3 Bits besteht.

Ist es möglich? Ich habe im Internet gesucht und Folgendes versucht:

char c[25] = "101";
FILE *binFile = fopen("binFile.bin", "wb");
int x = atoi(c);
fwrite(&x, sizeof(x), 1, binFile);

Aber am Ende, wenn ich die Bytes der Dateien überprüfe, sagt Windows mir, dass es sich um eine 4-Byte-Datei handelt! Und nicht 3bit!

Wie kann ich das machen, wenn es möglich ist? Danke vielmals.

  • Ich finde WORD ist das Wort hier.. en.wikipedia.org/wiki/Word_(Computerarchitektur)

    – Chad Harrison

    6. November 2012 um 20:36 Uhr

  • Die Sektion Variable Wortarchitekturen könnten für Sie besonders interessant sein.

    – Chad Harrison

    6. November 2012 um 20:47 Uhr

Benutzer-Avatar
Jon

Alle Dateisysteme¹ verarbeiten Dateien in Bytes (und weisen Speicherplatz mit einer viel größeren Granularität zu, mindestens 512 Bytes). Es gibt keine Möglichkeit, dass Sie eine Datei erhalten, die ist 3 Bit lang.

Das Beste, was Sie tun können, ist, ein ganzes Byte zu verbrauchen, aber 5 seiner Bits zu ignorieren. Konvertieren Sie dazu (unter der Annahme, dass die Zahl immer in ein Byte passt) die Eingabezeichenfolge in einen ganzzahligen Typ:

long l = strtol(c, 0, 2);

Holen Sie sich dann das niederwertigste Byte:

unsigned char b = l & 0xffl;

Und in die Datei schreiben:

fwrite(&b, 1, 1, binFile);

¹ Nun, vielleicht nicht alle. Es könnte irgendwo einige Forscher geben, die mit bitgroßen Dateisystemen experimentieren. Ich würde es nicht wissen.

  • Ich schätze, er würde viele einzelne Bits schreiben, von denen er für die ultimative Komprimierung eine Pufferversion erstellen könnte fwrite() die ein ganzes Byte auf einmal löscht, sobald es gefüllt ist.

    – Benj

    6. November 2012 um 14:22 Uhr

Ihre Ausgabedatei ist 4 Byte lang, weil Sie eine schreiben int zur Datei. Auf den meisten Plattformen ist ein int ist 4 Byte groß.

Sie können nicht weniger als 1 Byte auf einmal schreiben.

Benutzer-Avatar
Michel Keijzers

Was Sie tun können, ist es als Bits (3) zu schreiben und es mit Nullen zu einem Byte aufzufüllen. Sie müssen jedoch auch mit der Anzahl der Bits (oder Bits vom letzten Byte) beginnen (oder enden), die tatsächlich verwendet werden.

ZB (mit dem ersten Byte als Länge):

00000011   -> 3, meaning from the last (and only byte in this case, 
              only the first 3 bits are used)
10100000   -> 101 is the string, other 5 bits are 0, just use for padding

In diesem Fall beträgt der Overhead des ersten (Längen-) Bytes 50 %, je länger der String, desto geringer ist natürlich der Overhead-Prozentsatz.

Benutzer-Avatar
GEFÄNGNIS

2 Anmerkungen zu deiner Vorgehensweise:

  1. [Modern] Computer können nicht weniger als 1 Byte im Speicher verarbeiten, sodass Sie keine einzelnen Bits auf die Festplatte schreiben können.

    Außerdem weisen Dateisysteme normalerweise Speicherplatz in Blöcken (512 Bytes, 1 KB, …) zu, wo die Datei passt. Wenn Sie also eine 500-Byte-Datei haben, verlieren Sie tatsächlich 512 Byte Speicherplatz.

  2. atoi() konvertiert nicht von Strings in Binärzahlen, sondern in Integer. Eigentlich schreibst du 0b1100101welches ist 0d101. Sie sollten zuerst die Konvertierung durchführen. Etwas wie:

    char b = 0;
    for (int i=0; c[i]!=NULL; i++) 
    {
        b = ((b<<1) | atoi(c[i]));
    }
    

Sie schreiben die Bits nicht 101sondern der Binärwert der Dezimalzahl 101dh 1100101. Weil du bist fread eine Größe von sizeof(x) Bytes, Ihre Datei wird sein sizeof(x) Bytes lang.

1372370cookie-checkSchreiben von Bits in eine Datei in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy