Bitweises schreiben / Lese- und Schreiberoutinen



  • Hallo,

    ich habe folgendes Problem:

    Ich habe 32-Bit Integer - Werte. Diese möchte ich binär in zwei verschiedene Dateien schreiben, und zwar wie folgt aufgeteilt.
    In der ersten Datei soll jeweils die Anzahl der führenden "0"en gespeichert werden, und in die zweite, die verbleibenden Binärzeichen ohne eben diese "0"en.
    Ich muss dies leider so trennen, da ich mit der ersten Datei etwas machen muss (ich möchte diese nachher getrennt komprimieren, da diese Zahlen sehr viel gemeinsam haben), und die zweite sollte eben so klein wie möglich gespeichert werden, aber so, daß ich die original Werte wieder herstellen kann, wenn ich auch die erste Datei wieder habe.
    Ich suche nun eine Schreibroutine und eine Leseroutine für dieses Problem. Das ich aber froh bin "normale" Dinge in Dateien schreiben zu können und hiervon in der Umsetzung nicht sehr viel Ahnung habe (theoretisch ist das vorgehen klar), wäre ich für Hilfe sehr dankbar.

    Florian



  • Bitweise kannst du nicht schreiben. Die kleinste mögliche Einheit entspricht der Größe eines char s.



  • 32-bit-Daten: warum willst du die Nullen speichern - codier die doch sofort.
    z.B. 6 führende Nullen = 6.

    Aber ich denke die modernen Packalgorithmen haben schon ähnliche Funktionen
    implementiert.

    Ist dein Problem das Zählen der Nullen? Dann schau dir z.B. Infos über
    bitweises verschieben oder maskieren an.

    MfG f.-th.



  • f.-th. schrieb:

    32-bit-Daten: warum willst du die Nullen speichern - codier die doch sofort.
    z.B. 6 führende Nullen = 6.

    Aber ich denke die modernen Packalgorithmen haben schon ähnliche Funktionen
    implementiert.

    Ist dein Problem das Zählen der Nullen? Dann schau dir z.B. Infos über
    bitweises verschieben oder maskieren an.

    MfG f.-th.

    Die Anzahl der Nullen kenne ich und ich speichere natürlich nicht 6 Nullen, sondern die 6, das ist schon klar.

    Ich mache momentan folgendes:

    int bitdarstellung(char bitmuster[33], unsigned int byte, int msb)
    {
    int maske = 0x01;
    int i = 32;
    while( i>=0 ) {
    	if( byte & maske )
         bitmuster[i] = '1';
     else
      bitmuster[i] = '0';
     maske = maske << 1;
     i--;
    } // if
    
    return(0);
    }
    
    int main(int argc, char* argv[])
    
    bitdarstellung(bitmuster,komp[i], msb);
    fwrite(&msb, sizeof(unsigned int), 1 ,dateimsb);
    for (l=1; l<=msb; l++)
    {
      fwrite(&bitmuster[32-msb+l],1,1,dateirest);
    }
    

    Wobei msb, die Stelle des höchsten von 0 verschiedenen Bits ist, und komp die eigentliche zu speichernde Zahl.

    Das Problem ist nur, daß die Datei dateirest nachher größer ist, als die ursprünglichen Zahlen.

    Florian



  • @floriank:
    Klar ist die Datei nachher grösser, du schreibst ja auch statt einem Bit gleich ein Byte.

    Guck dir mal die Klassen LowFirstBitReader und LowFirstBitWriter der cryptopp an, vielleicht kannst du die verwenden.
    Wenn nicht musst du dir eben selbst was basteln.

    http://www.cryptopp.com/



  • hustbaer schrieb:

    Klar ist die Datei nachher grösser, du schreibst ja auch statt einem Bit gleich ein Byte.

    Guck dir mal die Klassen LowFirstBitReader und LowFirstBitWriter der cryptopp an, vielleicht kannst du die verwenden.
    Wenn nicht musst du dir eben selbst was basteln.

    http://www.cryptopp.com/

    Danke für den Tipp. Aber kannst du mir sagen wo diese Klassen sind? Ich bin anscheinend zu blöd und finde die einfach nicht. Ich habe mir die letzte Version heruntergeladen, aber kann einfach keine dieser Klassen finden. Vom Namen her sind es aber genau solche Klassen, wie ich sie suche.

    Danke
    Floriank



  • Also Google findet die Klassen sofort 😃

    http://www.cryptopp.com/docs/ref/class_low_first_bit_reader.html
    http://www.cryptopp.com/docs/ref/class_low_first_bit_writer.html

    Sind in zdeflate.h bzw. zinflate.h zu finden.

    p.S.: es gibt IDEs die Klassenlisten anzeigen können und es gibt find in files. nur so ... 😉


Anmelden zum Antworten