Base64-Kodierung



  • Hi, 🙂
    ich muss meine Zugangsdaten (Login und Passwort zu E-Mail-Server) base64 kodieren. In Wikipedia gibt es genug Information, um die Kodierung kennenzulernen.
    Weiß vielleicht jemand, ob der Algorithmus zur base64-Kodierung in C++ schon implementiert ist, damit man ihn benutzen kann? Wäre sehr nett.
    Ich glaub, dass es so ein Algotihmus schon gibt, weil er sehr oft verwendet wird.



  • Sicher gibt es schon genug Leute, die so einen Algorithmus umgesetzt haben - du mußt sie nur finden (Google ist dein Freund)

    PS: Und auf der Wikipedia-Seite gibt es ganz unten den Abschnitt "Weblinks" - und dort sind neben einigen Online-Umwandlern auch Quelltexte in C und Java verlinkt.



  • Wenn jemand braucht, eine Base64-Kodierung:

    void CMeineKlasseDlg::Base64Code(const CHAR *strIn, CString &strOut) {
    	const static CHAR base64ABC[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    	strOut.Empty();
    	const size_t len = strlen(strIn);
    	for(int i=0; i<len; i+=3) {
    		LONG l = ( ((LONG)strIn[i ])<<16 ) |
    				 (((i+1) < len) ? (((LONG)strIn[i+1])<<8 ) : 0 ) |
    				 (((i+2) < len) ? ( (LONG)strIn[i+2] ) : 0 );
    		strOut += base64ABC[(l>>18) & 0x3F];
    		strOut += base64ABC[(l>>12) & 0x3F];
    		if (i+1 < len) strOut += base64ABC[(l>> 6) & 0x3F];
    		if (i+2 < len) strOut += base64ABC[(l ) & 0x3F];
    	 }
    	  switch (len%3) {
    		case 1:
    	  strOut += '=';
    		case 2:
    	  strOut += '=';
      }
    }
    
    Cstring strUserName; // Das soll kodiert werden
    CString strEncode; // Hier liegt der Ergebnis der Kodierung
    Base64Code(strUserName, strEncode); // Kodierung
    TRACE("StrUserName nach der Kodierung: %s\n", strEncode); // Im Debugfenster ansehen
    

    Die Kodierung funktioniert ganz OK, habe getestet.
    Und eine Dekodierung:

    void CMeineKlasseDlg::Base64Decode(IN const CHAR* strIn, OUT CString& strOut) {
      const static CHAR base64ABC[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
      strOut.Empty();
      const size_t len = strlen(strIn);
      for (int i=0; i<len; i+=4) {
       LONG l =
         (( (strIn[i ] != '=')) ? (((LONG)(strchr(base64ABC, strIn[i ]) - base64ABC)) << 18) : 0) |
         ((((i+1) < len) && (strIn[i+1] != '=')) ? (((LONG)(strchr(base64ABC, strIn[i+1]) - base64ABC)) << 12) : 0) |
         ((((i+2) < len) && (strIn[i+2] != '=')) ? (((LONG)(strchr(base64ABC, strIn[i+2]) - base64ABC)) << 6 ) : 0) |
         ((((i+3) < len) && (strIn[i+3] != '=')) ? ((LONG)(strchr(base64ABC, strIn[i+3]) - base64ABC)) : 0);
    
      BYTE ch1 = ((l>>16) & 0xFF); if (ch1) strOut += ch1;
      BYTE ch2 = ((l>>8 ) & 0xFF); if (ch2) strOut += ch2;
      BYTE ch3 = ( l & 0xFF); if (ch3) strOut += ch3;
      }
    }
    

    Diese habe ich nicht getestet, aber muss auch gut sein.


Log in to reply