Suche schöne C++ Base64 Klasse



  • na ja wenn man sich

    idFile *dest
    [...]
    dest->Write( buf, out);

    anschaut muss man da doch ein wenig mehr umbiegen als einfach die Datentypen zu ersetzen, aber scheinbar werde ich da nicht herumkommen.

    Eigentlich unverständlich das es keine standard C++ Lösung gibt 😑



  • base schrieb:

    Eigentlich unverständlich das es keine standard C++ Lösung gibt 😑

    Dann mach doch eine. Warum muss immer alles vorgekaut sein?



  • Die Crypto++ Bibliothek besitzt Base64-Konverter: http://www.cryptopp.com
    Ist aufgrund mangelnder Dokumentation allerdings schwierig, den Einstieg zu finden. Für Base64 allein lohnt es sich vielleicht auch nicht. Zumindest aber ist das eine solide C++-Lösung 🙂



  • Walli schrieb:

    base schrieb:

    Eigentlich unverständlich das es keine standard C++ Lösung gibt 😑

    Dann mach doch eine. Warum muss immer alles vorgekaut sein?

    Weil ich, wie bereits geschrieben, keine Lust (ja ich habe keine Lust! Ich will wie bei der STL auf etwas vorgefertigtes zugreifen) und keine Zeit habe.

    Es gibt so viel zu tun, da verwende ich so viel wie möglich aus bereits vorhanden Bibliotheken, nicht jeder der hier Code haben will versucht sich darum zu drücken seine Hausaufgaben machen zu müssen ➡ ⚠



  • base schrieb:

    Es gibt so viel zu tun, da verwende ich so viel wie möglich aus bereits vorhanden Bibliotheken, nicht jeder der hier Code haben will versucht sich darum zu drücken seine Hausaufgaben machen zu müssen ➡ ⚠

    Ja, habe ich auch nicht behauptet. Aber wenn keine Standard-Lösung da ist, dann muss man sich eben schnell eine bestehende an die eigenen Bedürfnisse anpassen oder eben was eigenes machen. Den ID-Code hätte man zumindest in ner Viertelstunde umschreiben können.



  • Hmm. Ich hab da vor ner Weile mal was in C gecodet. Sollte sich ziemlich einfach nach C++ ummodeln lassen; ich poste es einfach mal, für den Fall, dass es jemand brauchen kann:

    #include <ctype.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char *base64_encode(char *dest, size_t n, char const *src) {
      static char const b64_tbl[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                                    "abcdefghijklmnopqrstuvwxyz"
                                    "0123456789+/";
    
      size_t i, j;
    
      for(i = j = 0; ; i += 4, j += 3) {
        if(src[j]) {
          dest[i    ] = b64_tbl[src[j] >> 2 & 0x3f];
          dest[i + 1] = b64_tbl[((src[j    ] << 4 & 0x30) |
                                 (src[j + 1] >> 4 & 0x0f)) & 0x3f];
        } else {
          dest[i] = '\0';
          break;
        }
    
        if(i >= n - 5)
          return NULL;
    
        if(src[j + 1]) {
          dest[i + 2] = b64_tbl[((src[j + 1] & 0x0f) << 2 |
                                 (src[j + 2] & 0xc0) >> 6) & 0x3f];
        } else {
          dest[i + 2] = dest[i + 3] = '=';
          dest[i + 4] = '\0';
          break;
        }
        if(src[j + 2]) {
          dest[i + 3] = b64_tbl[src[j + 2] & 0x3f];
        } else {
          dest[i + 3] = '=';
          dest[i + 4] = '\0';
          break;
        }
      };
    
      return dest;
    }
    
    static char base64_char_decode(char c) {
      if(islower(c))
        return c - 'a' + 26;
      if(isupper(c))
        return c - 'A';
      if(isdigit(c))
        return c - '0' + 52;
      if(c == '+')
        return 62;
      if(c == '/')
        return 63;
    
      /* Das ist zwar das selbe wie bei 'A', und von daher als Fehlermeldung
       * ungeeignet, aber diese Funktion ist eh nur intern gedacht, und das
       * hier _sollte_ nur auftreten, wenn c == '='. In dem Fall füllt
       * base64_decode halt einfach mit '\0' auf, was den String terminiert
       * und uns alle glücklich macht.
       */
      return 0;
    }
    
    char *base64_decode(char *dest, size_t n, char const *src) {
      size_t i, j;
      char c, d, e, f;
    
      i = strlen(src);
      if(i % 4 != 0 || i / 4 * 3 > n - 1)
        return NULL;
    
      for(i = j = 0; src[j]; i += 3, j += 4) {
        c = base64_char_decode(src[j    ]);
        d = base64_char_decode(src[j + 1]);
        e = base64_char_decode(src[j + 2]);
        f = base64_char_decode(src[j + 3]);
        dest[i    ] = (c << 2) | (d >> 4 & 0x03);
        dest[i + 1] = (d << 4) | (e >> 2 & 0x0f);
        dest[i + 2] = (e << 6) | f;
      }
      dest[i] = '\0';
    
      return dest;
    }
    

    Ist im Grunde immer drei byte von Hand gemangelt. Ich hab mich dabei im Wesentlichen nach der ERklärung auf http://de.wikipedia.org/wiki/Base64 gerichtet. Gut, es ließe sich bestimmt noch an der einen oder anderen Ecke was optimieren, aber es funktioniert, und ich finds eigentlich ziemlich übersichtlich.



  • Frage am rande und sorry das ich den Thread wieder rausgeholt habe, aber wofür benötigt man sowas? 😕



  • CDU Wähler brauchen sowas nicht.



  • Damit kannst du einen String verschlüsselt... mehr muss man nicht sagen, oder?

    Und wofür? Naja, wenn du halt mal Daten hast, die ein anderer nicht lesen können soll (zumindest nicht auf Anhieb, für wirklich vertrauliche Sachen ist Base64 dann längst zu unsicher)...



  • Reyx schrieb:

    Damit kannst du einen String verschlüsselt...

    Nein, als Verschlüsselung ist es nicht zu gebrauchen. Mit Base64 kann man Binärdaten auf den ASCII Zeichensatz abbilden u.a. zur Übertragung mit Protokollen, die nur Textinhalte zulassen.


Anmelden zum Antworten