# C++ Dezimal in Binär umwandeln



## Puepue (9. Juni 2010)

*C++ Dezimal in Binär umwandeln*

Hallo zusammen,
ich versuche gerade einen Text in ascii-Code und diesen Ascii Code in Binärcode umzuwandeln.

Ich schaffe das so weit auch schon als Bildschirmausgabe:

```
for ( int a = 0; a < strlen(unverschluesselt); a++ )
	{
		cout << (int)unverschluesselt[a] << "\t";
		for ( char x = 8; x>= 0; x-- )	// Jede bin-Zahl hat 8 Stellen
		{
			if ( (int)unverschluesselt[a] & 1<<x )
			{
				cout << "1";
			}
			else
			{
				cout << '0';
			}
			
		}
		cout << endl;
	}
```

unverschluesselt wird dabei so an die Funktion übergeben:
char * crypt ( char * unverschluesselt )

Nun möchte ich das aber weiterverwenden können.
Also benötige ich bspw ein char .. wo dann bspw. drin stehen könnte "01010101 10101010 " usw. 
Kann ich das mit einem char o.ä. machen?
Wenn nicht, wäre es dann sinnvoll, alles in eine Textdatei zu schreiben und dann von dort auszulesen?
Ich halte das im Moment für die simpelste Methode.


----------



## boerigard (9. Juni 2010)

*AW: C++ Dezimal in Binär umwandeln*

Sicher, du kannst es über einen char* (C-String) machen. Das Hauptproblem bei der Sache ist: wo legst du für diesen String Speicher an und wo gibst du ihn wieder frei?

Möglichkeiten:
1. Du legst in deiner Funktion crypt mit new/malloc Speicher für deinen C-String an und gibst dann einen Zeiger darauf zurück. Das ist aber unschön und fehleranfällig, weil du musst ja dann daran denken den Speicher beim Aufrufer wiederfreizugeben. Vergisst man schnell.

2. Deine Funktion crypt bekommt noch einen zweiten Parameter (char* binary) und je nach Implementation noch einen Parameter size_t (int) für die maximale Anzahl an Zeichen, die in char* binary gespeichert werden können.
Außerhalb der Funktion legst du also Speicher an (vielleicht sogar ganz ohne new/malloc mit char binary[1024] oder so). Übergibst das Array an deine Funktion crypt, crypt schreibt seine 100101-Folgen darein und fertig.

Aber am einfachsten wäre es, denke ich (da du eh in C++ schreibst), wenn deine Funktion statt einem char* einen std::string zurückgibt. Da musst du dich nicht um die Speicherverwaltung kümmern. An deinen std::string kannst du mit += '1' oder '0' Zeichen anhängen.

Dein Umweg über eine Datei geht natürlich auch, ist aber nicht sehr effizent.


----------



## Puepue (9. Juni 2010)

*AW: C++ Dezimal in Binär umwandeln*

Hab leider noch nie mit string's gearbeitet und in der Schule haben wirs auch noch nicht durchgenommen.. fällt also leider weg, weil ichs nächste Woche präsentieren muss =/

PS: Warum ist das mit der Datei ineffektiv?


----------



## boerigard (9. Juni 2010)

*AW: C++ Dezimal in Binär umwandeln*



Puepue schrieb:


> PS: Warum ist das mit der Datei ineffektiv?


Rein von der Ausführungszeit. Wenn du Daten erst in eine Datei (Festplatte) speichern musst, um sie dann gleich wieder auslesen zu können, dauert das natürlich länger, als wenn die Daten nur im Speicher (Ram) jongliert werden. Für kleine Umrechnungen sicherlich nicht von Belangen. Wenn du mal MB-weise umrechnen willst, wird es schon merklicher. Aber ist wohl für ein Schulprojekt nicht das Entscheidende.

Wenn du mit der Datei zurechtkommst, dann mach es doch so.

Ansonsten probier es doch mal mit Möglichkeit 2. Gibt es in deinem Programm eine maximale Größe (Länge) für char* unverschluesselt? 
Falls Ja, dann weißt du ja wieviel Speicher (wieviele Zeichen) dein Lösungs char* braucht. Dann wird es einfach.
Falls nein, müsstest du mit new/malloc hantieren.


----------



## Puepue (12. Juni 2010)

*AW: C++ Dezimal in Binär umwandeln*

Ich habs nun geschafft Dezimal in Binär umzuwandeln.
Andersrum habe ich aber so meine Probleme..
Ich habe immer 9 Stellen
also bspw.
000000101 
immer alle aneinandergereiht. Das ganze mit einem Zeichen zu trennen wäre kein Problem, dann hääte ich also entweder
000000101 000000101 
oder
000000101000000101

Das ganze müsste ich ja für jeden Block von hinten anfangen also
1*256
0*128
1*64
0*32
0*16
0*8
0*4
0*2
0*1

Da ich weiß, dass es immer 9 stellen sind, weiß ich auch, dass die erste Zahl immer eine 256 ist da müsste ich also nicht mehr viel berechnen

Kann mir da jemand helfen?


----------



## boerigard (12. Juni 2010)

*AW: C++ Dezimal in Binär umwandeln*

Erstmal eine Frage: Warum hast du deine Binärzahlen in 9er-Blöcke eingeteilt? Die "natürliche" Einteilung wären acht Stellen, denn ein Byte hat acht Stellen. 

Gut, wenn du bei neun Stellen bleiben willst und es auch immer genau neun Stellen sind (notfalls mit füllenden Nullen), dann könnte man deine Methode so implementieren:

```
char binstr[] = "101000000";	
char *pBinstr = binstr;	
int zahl = 0;
int multi = 256;
	
while(multi)
{
    zahl += multi * (*pBinstr == '1' ? 1 : 0);
    multi /= 2;
    pBinstr++;
}

cout << "Ergebnis = " << zahl << endl;
```
Glücklich bin ich mit der Methode aber nicht.
Besser und ohne die neun Stellen Einschränkung wäre:

```
char binstr[] = "101000000";	
char *pBinstr = binstr;	
int zahl = 0;

while(*pBinstr)
{
    zahl <<= 1;
    zahl += (*pBinstr == '1' ? 1 : 0);
    ++pBinstr;
}
	
cout << "Ergebnis: " << zahl << endl;
```

EDIT: Es gibt dann noch eine Möglichkeit mit der C-Funktion strtol (gibt einen long int zurück).

```
#include <cstdlib>
...
cout << strtol("101000000",0,2) << endl;
```


----------



## Puepue (13. Juni 2010)

*AW: C++ Dezimal in Binär umwandeln*

hm die 3. Lösung reicht mir in dem Fall schon, danke


----------

