binary: 11 bit Integer schreiben.



  • Hallo, ich würde gerne binary Files mit beliebiger "int" Darstellung schreiben.

    Im header soll als erstes die Länge für jedes int stehen, also hier z.B. 11;

    dann sollen in der Datei z.B. 10 ints a je 11 stellen folgen, so in etwa:

    00000000001 00000000101 00000000011 00000000111 ...
    entspricht 1, 5, 3, 7

    Also das Problem ist: Wie bekomme ich aus einem 32 (bzw. 64) bit Integer einen "bitstream" variabler Länge (hier z.B. 11).

    Danke, Jochen

    PS: Warum das ganze? Komprimierung (bitte jetzt keine Vorschläge zu Komprimierung)



  • alles klar, geht mit:

    std::bitset<11> var(3);
    
    cout << var << endl;
    

    liefert;

    00000000011



  • Hmmm, hat sich leider doch noch nicht erledigt.

    Von bitset bekomme ich blöderweise quasi nur nen String. Gib's in C++ überhaupt eine Möglichkeit, binäre Dateneinheiten kleiner als 1 char (1 Byte) zu schreiben?



  • Kleiner als char ist eigentlich nicht vorgesehen. Du kannst dir einen Wrapper um bitset machen (oder ne einfache Hilfsfunktion mit sstream, jenachdem was du willst). Oder du benutzt vector<bool>, der aber mehr schlecht als recht ist.



  • Kommt in der implementation drauf an was du willst.
    1.)willst du binär schreiben - ich gehe mal davon aus
    2.)kannst du verschmerzen, dass keine lücken in der Datei sind, wenn trotzdem richtig eingelesen wird - ich denk mal...
    3.)daraus folgt, dass du größere Zahlen abschneiden willst.
    Ich würde das in etwa so machen:

    template<unsigned s>
    void schreibe(std::vector<unsigned> v,std::ofstream& f)    //kann man hier explizit s angeben? bin mir nicht sicher
    {
        unsigned l=0,tmp1=0,tmp2=0;mask=2047;    //hoffe mal mask stimmt
        for(unsigned i=0;i<v.size();++i)
        {
            tmp1=mask&v[i];
            tmp1<<=(32-l-11);
            l+=11;
            if(l<21)
            {
                //sonderfall behandeln (is mir jetzt zu viel zu schreiben...
                //und l ändern
                //und schreiben
                //und werte zurücksetzen
                break;
            };
            tmp2|=tmp1;
        };
    };
    

    Keine garantie auf richtigkeit, bitoperationen sind nicht meine Stärke...
    lesen müsste die shiftings halt wieder rückgängig machen...


Anmelden zum Antworten