# Char Array nach char umwandeln



## ProgFreak (31. Mai 2007)

Hallo!

Wie kann ich mit Hilfe von <openssl/md5.h> unter Linux 
von einem String den MD5 Hash berechnen? Ich habe schonmal angefangen aber dabei ist ein Problem aufgetreten.


```
string buf = "password";
		char hash;		
		MD5_CTX context;
		
		unsigned char digest[16];
		unsigned int len = strlen(buf.c_str());

		MD5_Init(&context);
		MD5_Update (&context,buf.c_str(), len);
		MD5_Final(digest, &context);

		cout << "MD5: ";
		for (int i = 0; i < 16; i++) {
			printf ("%02x", digest[i]);
                  }
```
 
Soo. Der gibt mir zwar da den Hash aus aber ich habe das Problem, dass ich den Hash quer verteilt in einem Array habe. Wie kann ich digest jetzt in einen ganz normalen char umwandeln?
Sorry ich stell mich gerade irgendwie etwas zu blöde dafür an


----------



## Thomasio (31. Mai 2007)

Ein C string ist IMMER ein array
Wenn du das an einem Stück willst, dann am besten als std::string

string digestStdString(digest);

den kannst du bei Bedarf auch wieder als digestStdString.c_str() ausgeben.


----------



## ProgFreak (31. Mai 2007)

Hallo!

Deine Idee funktioniert leider nicht.
Es kommt folgende Meldung:

Fehler: ungültige Umwandlung von »unsigned char*« in »const char*«

Was kann ich tun?


----------



## Thomasio (31. Mai 2007)

Genau DAS ist der Grund, warum ich C strings auch nicht mag, da kommt man aus dem konvertieren und kopieren gar nicht mehr raus, weil

unsigned char ist nicht gleich const char ist nicht gleich char* usw usw

Ich werde mir wahrscheinlich im Leben nicht merken können, was man wann und wie von wo nach wo kopieren oder konvertieren muss, ob mit strcopy oder sonstwas, im Zweifelsfalle, wenn ich mir nicht sicher bin, dann mache ich das ohne vorgegebene Funktionen selber, ganz simpel, jedes Zeichen einzeln


```
char myChar[17];

for (int i = 0; i < 16; i++)
    {
        myChar[i] = digest[i];
    }
mychar[16] = '\0';

// dann sollte auch die Umwandlung zu std gehen

string digestStdString(myChar);
```


----------



## ProgFreak (31. Mai 2007)

Thomasio hat gesagt.:


> Genau DAS ist der Grund, warum ich C strings auch nicht mag, da kommt man aus dem konvertieren und kopieren gar nicht mehr raus,



Du sprichst mir aus der Seele 

naja auf jeden fall hat deine idee ansatzweise funktioniert.
Hier nochmal der Code:


```
cout << "MD5: ";
		char myChar[17];

		for (int i = 0; i < 16; i++)
  		{
        		myChar[i] = digest[i];
   		 }
		myChar[16] = '\0';

		// dann sollte auch die Umwandlung zu std gehen

		string digestStdString(myChar);
		cout << digestStdString << endl;
```

Na? was erwartet man? richtig, dass er jetzt den Hash ausgibt. Was gibt er aber z.b. bei "hallo" aus? das hier: y?*$?????M?
Ok und was mache ich jetzt? xD
also mit printf hat er es ja richtig ausgegeben


----------



## Thomasio (31. Mai 2007)

cout << digestStdString.c_str() << endl; // womit wir schon wieder beim konvertieren sind


----------



## ProgFreak (31. Mai 2007)

Hallo!

Das hat nichts gebracht. Das Ergebnis ist immer noch das gleiche!


----------



## Matthias Reitinger (31. Mai 2007)

Thomasio hat gesagt.:


> Genau DAS ist der Grund, warum ich C strings auch nicht mag, da kommt man aus dem konvertieren und kopieren gar nicht mehr raus, weil
> 
> unsigned char ist nicht gleich const char ist nicht gleich char* usw usw


Ein C-String ist vom Typ char *. Wenn du Daten in eines anderen Typs hast, die du in einen C-String bringen möchtest, musst du gezwungenermaßen eine Konvertierung durchführen. Das hat nichts mit C-Strings an sich, sondern mit der Typsicherheit von C zu tun.



ProgFreak hat gesagt.:


> Wie kann ich digest jetzt in einen ganz normalen char umwandeln?


Bist du dir sicher, dass du den 128 Bit breiten Hashwert in eine 8 Bit breite Speicherzelle bringen willst? Oder willst du vielleicht eher eine Stringrepräsentation des Hashwertes? Wenn ja, dann versuch's mal so:

```
ostringstream oss;
oss << hex;
for (int i = 0; i < 16; ++i)
    oss << static_cast<int>(digest[i]);

string digest_str = oss.str();
```

Grüße,
Matthias


----------



## ProgFreak (31. Mai 2007)

hallo!

Fehler: Aggregat »std:stringstream oss« hat unvollständigen Typ und kann nicht definiert werden

das kommt gleich bei der deklaration von der variable. kann mit dem datentyp so nichts anfangen. wie kann man das ganze berichtigen? und was ist "hex" ?


----------



## Matthias Reitinger (31. Mai 2007)

ProgFreak hat gesagt.:


> Fehler: Aggregat »std:stringstream oss« hat unvollständigen Typ und kann nicht definiert werden


Möglicherweise hast du vergessen, den Header <sstream> einzubinden.



ProgFreak hat gesagt.:


> und was ist "hex" ?


Ein Stream Manipulator, der dafür sorgt, dass Ganzzahlen zur Basis 16 ausgegeben werden.


----------



## ProgFreak (31. Mai 2007)

perfekt! danke!
jetzt gehts!
ich könnte dich knutschen!  endlich bin ich damit so gut wie durch.
eine kleinigkeit bleibt noch:
der plaintext von dem ich einen hash erzeugen will hat anscheinend am ende noch ein Zeilenumbruch. Wie kann ich das aus dem String entfernen? (also das letzte zeichen muss weg)


----------



## Thomasio (1. Juni 2007)

digest = digest.substr(0, digest.length() - 1);


----------

