Char Array nach char umwandeln

ProgFreak

Mitglied
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.

Code:
		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
 
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.
 
Hallo!

Deine Idee funktioniert leider nicht.
Es kommt folgende Meldung:

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

Was kann ich tun?
 
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

Code:
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);
 
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 :rolleyes:

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

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
 
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.

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:
C++:
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
 
hallo!

Fehler: Aggregat »std::ostringstream 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" ?
 
Zurück