[C++] Text zu binär und umgekehrt

Termy2007

Mitglied
Hallo!
Ich möchte eine Forms-Anwendung in C++ (VC 2005 express) schreiben, welche einen eingegebenen Text aus der ersten TextBox in die einzelnen Zeichen aufteilt und dann diese als Binärzahlen (also die 0en und 1er) in der zweiten TextBox ausgibt.

Ich hab schon 2 Tage lang google gelöchert...hab aber nur C Code gefunden, der mit der Konsole arbeitet!

Ich hab da schon ein bisschen angefangen. Hier der Code für den Button, der die Umwandlung ins Binärsystem einleitet.

Code:
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
			 
			 { 
				 progressBar1->Value = 0;
				 progressBar1->Maximum = Convert::ToInt32(textBox1->Text->GetEnumerator());

				 int i;
				 int bitint;
				 string bitstring;
				 for(i = 0; i < Convert::ToInt32(textBox1->Text->GetEnumerator()); ++i) 
				 {
                                                 bitint = static_cast<int> (bitset<8>(textBox1->Text[i]));
				 bitstring = Convert::ToString(bitint);
				 textBox2->Text->Insert(Convert::ToInt32(textBox1->Text->GetEnumerator()), bitstring);
				 progressBar1->Value = progressBar1->Value + 1;
				 }
			

			 }

Folgender Fehler:
Code:
error C2440: 'static_cast': 'std::bitset<_Bits>' kann nicht in 'int' konvertiert werden

Bitte lacht mich net aus! Ich bin noch Anfänger :)

Meine Fragen sind also:
1. Was mache ich falsch?
2. Kann man es auch einfacher haben?
3. Wie kann man die ganze Sache umdrehen (Binär zu Text)?

Ich höffe, ihr könnt mir helfen!
Mfg Termy 2007:D
 
Hallo Termy,

ich bin zwar C++ Coder, habe aber gerade dein Problem mal so gelöst.

Code:
            string txt = textBox1.Text;
            StringBuilder sb = new StringBuilder();
            
            CharEnumerator enumerator = txt.GetEnumerator();
            while( enumerator.MoveNext() ) {
                Char c = enumerator.Current;

                Int16 myInt = (short)c;
                sb.Append(myInt >= 128?"1":"0");
                if (myInt >= 128) myInt -= 128;
                sb.Append(myInt >= 64? "1" : "0");
                if (myInt >= 64) myInt -= 64;
                sb.Append(myInt >= 32? "1" : "0");
                if (myInt >= 32) myInt -= 32;
                sb.Append(myInt >= 16 ? "1" : "0");
                if (myInt >= 16) myInt -= 16;
                sb.Append(myInt >= 8 ? "1" : "0");
                if (myInt >= 8) myInt -= 8;
                sb.Append(myInt >= 4 ? "1" : "0");
                if (myInt >= 4) myInt -= 4;
                sb.Append(myInt >=  2 ? "1" : "0");
                if (myInt >= 2) myInt -= 2;
                sb.Append(myInt >= 1 ? "1" : "0");
                if (myInt >= 1) myInt -= 1;
                sb.Append(" ");
            }

            textBox2.Text = sb.ToString();
        }
    }

Funktioniert so weit, aber der Weg ist bestimmt nicht der eleganteste ;-)

Den umgekehrten Weg findest du bestimmt selbst heraus.

Schönen Gruß,

Peter
 
Zuletzt bearbeitet:
Hi,
ein bitset ist ein komplexer Datentyp den du nicht einfach in ein
Integer casten kannst. Du kannst deinen bitset aber direkt mit der
Funktion to_string in einen String wandeln lassen.

In deinem Schleifenkopf würde ich den Funktionsaufruf :
Code:
Convert::ToInt32(textBox1->Text->GetEnumerator());
durch progressBar1->Maximum ersetzen.
Muss ja nicht jedesmal ausgeführt werden.

Benny
 
Danke für die schnellen Antworten!

An pschilling:
Könntest du mir deinen Vorschlag etwas näher erklären?
Ich blick da nicht so richtig durch!:confused:

Gibt es denn da nichts einfacheres?

Termy2007
 
Hi Termy,

mit dem CharIterator durchlaufe ich den String und hole mir die einzelnen Zeichen.

Das zeichen wandle ich in einen Zahlenwert und wandle diesen in einen binärstring.

Ein char ist 1 byte groß, also genau 8 bits.

Jede bit-Position steht für eine Zahl. Das erste, also ganz linke bit steht für die 128, das 2 für 64 u.s.w.

Nun schau ich ob, der ASCII-Wert über 128 liegt. Wenn er es tut, setze ich also eine 1 an die erste position des binärstrings, sonst eine 0.

Das ganze wiederhole ich dann bis zum letzten bit mit den entsprechenden Werten.

Keine Zauberrei.

Gruß,

Peter
 
Danke pschilling!
Hab ich verstanden...ok.
Und wie dreht man das um? Bzw. wie sieht dafür der Code aus?
Muss man dann nur gucken..ok hier hab ich ganz links ne 1 also über 128?
Das wird doch nicht reichen oder?
 
Ahoi,

habe gerade mal die Funktion hier geschrieben:

Code:
        public char binaryStringTochar(string binStr) {
            CharEnumerator enumerator = binStr.GetEnumerator();
            if( binStr.Length != 8 ) {
                // Kein gültiger binärstring
                return (char)0;
            }
            int i = 128;
            int value = 0;
            while (enumerator.MoveNext())            {
                Char c = enumerator.Current;
                if( c == '1') {
                    value += i;
                }
                else if(c == '0' ) {
                }
                else {
                    // Kein gültiger Binärstring !! Nur 1 und 0  sind erlaubt
                }
                i /= 2;
            }
            return (char)value;
        }

Diese wandelt dir einen 8-zeichen langen string in den entsprechenden char Wert.

Den Rest bekommst jetzt bestimmt auch hin.

Viel Erfolg,

Peter
 
Zuletzt bearbeitet:
Ich glaube, bei der Umwandlung des "Char" kann man noch etwas Tipperei sparen :)
C++:
Char c = enumerator.Current;

for( int i = 0; i < 8; i++ )
{
    sb.Append( (c & (0x80 >> i)) ? "1" : "0" );
}
            
sb.Append(" ");
Gruß
MCoder
 
Danke für die Antworten.
Hab haber noch eine kleine Frage:

Code:
sb.Append( (c & (0x80 >> i)) ? "1" : "0" );

Was passiert da genau?
Vor allem:
Code:
0x80
Code:
? "1" : "0"

Sonst ist alles klar!
Danke für eure Hilfe!
 
Nicht böse sein MCoder, dass ich deinen Code kommentiere ;)

Also 0x80 ist die hexadezimale Form für 128.

x >> y (oder auch x << y) nennt man den Shift-Operator.

Mit diesem werden die bits des Wertes x um y Positionen nach rechts (bzw. links) verschoben.
Code:
    int a = 0x80; // Der Wert 128 wird a zugewiesen Binäre darstellung 10000000
    a >> 1; // Bits um 1 nach rechts verschieben, Binäre darstellung     01000000 = 64

Code:
Ausdruck?a:b;
Kannst du als verkürzte Schreibweise für
Code:
if( Ausdruck) {
    a;
}
else {
    b;
}
sehen.

Wenn Ausdruck == TRUE, dann wird der erste Wert verwendet, sonst der zweite hinter dem Doppelpunkt.

Gruß,

Peter
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück