bitset in char* schreiben
-
Hi, ich habe folgendes Problem:
Ich habe ein Bitset bestehend aus 24 bits (bitset<24>). Jetzt möchte ich diese 3 Bytes in ein char-Array speichern. ( Also nicht wie bei der to_string-Methode )
Es kann auch ein anderer Datentyp sein, wei z.B. unsigned short, oder irgendwas andres das genau 3 Bytes groß ist.Wie kann das am einfachsten gelöst werden, oder gibt es schon eine Lösung die mir nur nicht bekannt ist?
-
char* f(bitset<24> const& r) { string p = r.template to_string<char, char_traits<char>, allocator<char> >(); char* q = new char[p.size()+1]; return strcpy(q, &p[0]); }
Oder so ähnlich. Bliebe noch die Frage, was Du damit machen willst.
-
mmmhhh, alles was ich bekomm ist ne ganze Reihe von Fehlermeldungen. Was muss ich denn alles includen? std hab ich, string auch.
Wäre es eigentlich auch möglich die Größe des an eine Methode übergebenen bitset nicht bei der definition festzulegen, sondern variabel zu halten? Auch wenn ich weiß dass es eigentlich keine dynamischen bitsets gibt!
-
@Daniel E.: Ich verstehe es eher so, daß er nicht in Text konvertieren will, sondern es sollen je 8 Bit in einem char sein...
@nets-rac:
Ja, es ist möglich die größe dynamisch(zur Compilezeit) zu halten, zumindest muß man sie nicht fest vorgeben, und zwar mit templates:
template<int size> void DoSomething(bitset<size> & bs) { // Code }
funktioniert für bitsets jeder Größe.
MfG Jester
-
@jester: stimmt ich will die jeweiligen 8 bit in einem char haben. Ich muss zugeben ich habe meine Frage voreilig gestellt wegen der größe des bitsets...da hätte ich selber drauf kommen müssen. aber trotzdem vielen Dank!
Wegen meinem ursprünglichen Problem bin ich grad doch noch selbst am basteln und könnte evtl eine Lösung finden. Ich geh einfach alle bits des bitfeldes durch und "veroder" sie binär mit dem char...hängt zwar noch an einer Stelle, aber wie gesgat ich denk ich bekomms noch in den Griff.
Bin für weitere Ideen aber natürlich noch zu haben!
-
Ich habe es jetzt so gelöst:
unsigned char buffer[3]; bitset<24> set; for ( int i=0, j=0; i<set.size(); i++, j++ ) { if ( j > 7 ) j = 0; buffer[i/8] |= set[i]<<j; }
@jester: ich glaube ich war zu voreilig. Wenn ich die Methode mit dem template deklariere, wie sieht denn dann die deklaration des bitsets aus und der dazugehörige Aufruf der Methode?
-
Wenn Du statt dem j einfach um (i%8) shiftest hast Du den gleichen Effekt => eine Variable weniger.
#include <bitset> #include <string> template <int SIZE> std::string ToChars(const std::bitset<SIZE> & bs) { int BufferSize = (SIZE+7)/8 // Aufrunden!!! std::string buffer(BufferSize); for ( int i=0; i<SIZE; ++i) { buffer[i/8] |= set[i]<<(i%8); } return buffer; } int main() { using namespace std; bitset<24> mybs(2000); cout << ToChars(mybs) << endl; cin.get(); }
Nicht getestet, hab grad keinen Compiler zur Hand... sag mal, ob' funktioniert!
-
leider hat dies nicht funktioniert. Ich bekomm die selbe Fehlermeldung als ich es auch versucht hatte:
no matching function for call to `ToChars (bitset<24,long unsigned int> &)'
-
Also bei mir (VC 7.1 + STLPort) funktioniert das, welchen Compiler bzw. welche STL verwendest Du?
Ist es im Standard festgelegt, daß bistset nur einen Parameter haben darf, oder darf die Implementierung weitere Parameter haben???template <int SIZE, typename T> std::string ToChars(const std::bitset<SIZE, T> & bs) { int BufferSize = (SIZE+7)/8; // Aufrunden!!! std::string buffer; buffer.resize(BufferSize); for (int i=0; i<SIZE; ++i) { buffer[i/8] |= bs[i]<<(i%8); } return buffer; } int main() { using namespace std; bitset<24> mybs(2000); cout << ToChars(mybs) << endl; cin.get(); }
Soll möglicherweise dann auf Deinem System funktionieren. Ich weiß aber nicht, ob das portabel ist... Möglicherweise solltest Du einfach beide Versionen zur Verfügung stellen. Aber mich würde doch mal interessieren, was der Standard dazu sagt!
MfG Jester
-
Also so funktioniert es bei mir.
Ich arbeite unter Linux und benutz den gcc (2.95.3)
Aber ob dies nun wirklich portabel ist oder dem Standard entspricht weiß ich auch nicht...