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, 7Also 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...