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