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 leeren

    oder 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


Anmelden zum Antworten