bits zu bytes
-
hi!
ich habe einen string, der zum beispiel so lautet: "01101101010000010101111001", also in binary geschrieben ist. wie kann ich diese buchstaben jetzt im 8er-pack zu einem buchstaben zusammenfassen?
p.s.: in php gibts die schöne funktion bindec, die genau das macht.
-
std::bitset
-
bitset<200> Bits(string ("10010101"));
Du musst nur drauf achten, dass der Wert der in den <> steht, immer kleiner ist als die Länge des Strings, sonst gibts Probleme. Die jetzt aufzuteilen in 8er Pakete sollte ja kein Problem sein...
-
äh, tut mir leid, aber ich versteh das nicht so ganz. könntest du mir vielleicht ein kleines beispiel machen?
-
ich glaube es gibt keine direkte moeglichkeit (mit std-mitteln)
aus der bit-darstellung eine string-darstellung zu bekommen.eine moegliche (ungetestete):
string s( "00010001" ); // 8 bits bitset<8> bits( s ); int ascii_code = (int)bits.to_ulong();
um an die anzahl der bits pro char zu kommen:
int bits = numeric_limits<char>::digits;
-
hmm, da kommt "bitset - undeclared identifier"
was muss ich denn da includen? im moment binde ich stdio.h, stdlib.h und string.h ein
-
#include<bitset> //Du solltest anstat den alten C-Header besser die neuen C++-Header einbinden #include<cstdio> #include<cstdlib> #include<string>
Jetzt liegt natürlich alles im Namespace std.
-
hm...jetzt hab ich bitset, cstdlib, cstdio und string inkludiert, aber es kommt bei dem aufruf von "bitset<8> bits("10110010");" immernoch zur fehlermeldung.
-
ah, gut, ich musste das std:: davor machen. danke an alle!
-
gleich das nächste problem: ich möchte jetzt ein char-array mit dem binary-code erstellen. dieses soll die größe strlen(text)*8 haben. sowas geht ja nicht:
char bla[strlen(text)*8];
also dachte ich an malloc, aber damit kenn ich mich nicht so gut aus. kann mir jemand erklären, wie das geht, oder hat jemand eine bessere idee?
-
Einen Container benutzen. z.B. std::string
Oder FAQ lesen.
-
#include <iostream> #include <bitset> #include <string> using namespace std; int main(int argc, char * argv[]) { bitset<8> test; test = 12; string temp; // Das .template kenn ich nicht. Nur aus der MSDN übernommen. // Kann da jemand ein paar worte zu sagen ? Ich tippe darauf das man // dem Compiler so sagt das man eine templatemethode verwenden will // verstehe die Syntax aber nicht temp = test.template to_string<char,std::char_traits<char>,allocator<char> >(); return 0; }
-
@Knuddlbaer
Das template darf hier gar nicht stehen! Diese Anwendung des template-Schlüsselwortes darf nur *innerhalb* eines Templates auftauchen und deine main-Funktion ist kein Template.// Kann da jemand ein paar worte zu sagen ?
Schau mal in meine Mail vom 04.04.2003. Darin habe ich das schonmal versucht zu erklären.
-
Knuddlbaer schrieb:
// Das .template kenn ich nicht. Nur aus der MSDN übernommen.
// Kann da jemand ein paar worte zu sagen ? Ich tippe darauf das man
// dem Compiler so sagt das man eine templatemethode verwenden will
// verstehe die Syntax aber nicht
temp = test.template to_string<char,std::char_traits<char>,allocator<char> >();das template gehört hier nicht hin. Ich weiss jetzt nicht ob es auch ein Fehler ist, es hier hinzuschreiben - aber unnötig und schwer lesbar ist es garantiert.
Du brauchst template nur, wenn du eine Template Methode eines Objektes dessen Typ ein 'dependent name' ist.
kurz gesagt:
template<class T> void foo() { T t; t.foo<int>(); //geht nicht t.template foo<int>(); //so geht es }
Denn sonst weiss der Compiler ja nicht, ob du nicht folgendes meinst:
t.foo < 0
wenn wir davon ausgehen, dass wir statt int einen int übergeben.
Der Compiler müsste den ganzen Ausdruck betrachten - und das passt nicht in die Syntax von C++ - deshalb musst du sagen, dass du ne template Methode meinst. und nicht einen Member mit einer Zahl vergleichen willst.
Bei non Template Code braucht man das template natürlich nicht - da der compiler ja alle Member des Typens kennt.
-
okay, ich habs jetzt trotzdem mit malloc gemacht
allerdings gibts wieder probleme:
ich deklariere die variable so:
char *buffer = (char *) malloc(8*strlen(text));
dann füge ich mit einer schleife immerwieder einen string an:
buffer = strncat(buffer, code, 8*strlen(text));
wenn ich dann allerdings den buffer ausgeben will:
printf("%s\n", buffer);
dann wird zwar der inhalt des buffers ausgegeben, aber davor noch zig "=" und 4 "²". woran liegt das denn?
-
Wenn Du Speicher allocierst kann dieser irgendwelche Werte beinhalten.
Du müsstest also mit memset noch mal den Speicher leerenoder Dir das leben viel Einfacher machen und std::string verwenden.
-
Du programmierst hier ja fast nur mit C, wenn du C++ programmieren willst, solltest du new, delete, string, stringstream und all die Anderen verwenden, die Vorteile liegen auf der Hand und weniger Probleme hast du dann auch.
MfG MAV
-
okay, ich hab eben nur C gelernt, muss ich mich eben umstellen.
jetzt kommt das nächste problem: wie kann ich die bytes in bits umwandeln? also die zahl "15" soll dann z.B. einen vier-stelligen binary-string ergeben, die zahl 3 einen 2 stelligen usw.
-
weiß niemand wie das geht? also ich will so etwas (keine ahnung, ob die angaben stimmen):
0 => 0
1 => 1
2 => 00
4 => 000
5 => 001
15 => 1111
...
...
...
-
Hallo,
also eigentlich wurde dir die Lösung für dieses Problem schon genannt, die STL-Klasse bitset kann auch das (hier 8 Bits):
// 15 Dezimal in binaer umwandeln, 8 Bits anzeigen.. std::bitset<8> bs(15); std::cout << bs.to_string() << std::endl;
MfG