Base64 Code erklärung



  • const char b64[] =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    
    char ascii[256] =
    {
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
      52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
      64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
      15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
      64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
      41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
    };
    
    void
    base64_in (unsigned char *buf, char *obuf, int len)
    {
      int i;
      for (i = 0; i < len - 2; i += 3)
        {
          *obuf++ = b64[(buf[i] >> 2) & 0x3F];
          *obuf++ = b64[((buf[i] & 0x3) << 4 | ((int) (buf[i + 1] & 0xF0) >> 4))];
          *obuf++ = b64[((buf[i + 1] & 0xF) << 2) | ((int) (buf[i + 2] & 0xC0) >> 6)];
          *obuf++ = b64[buf[i + 2] & 0x3F];
        }
      if (i < len)
        {
          *obuf++ = b64[(buf[i] >> 2) & 0x3F];
          if (i == (len - 1))
    	{
    	  *obuf++ = b64[((buf[i] & 0x3) << 4)];
    //        *obuf++ = '=';
    	}
          else
    	{
    	  *obuf++ = b64[((buf[i] & 0x3) << 4 | ((int) (buf[i + 1] & 0xf0) >> 4))];
    	  *obuf++ = b64[((buf[i + 1] & 0xf) << 2)];
    	}
    //      *obuf++ = '=';
        }
      *obuf++ = '\0';
    }
    
    void
    base64_out (char *buf, unsigned char *obuf, int len)
    {
      int nprbytes;
      char *p = buf;
      while (ascii[(int) *(p++)] <= 63);
    
      nprbytes = len - 1;
    
      while (nprbytes > 4 && *buf != '\0')
        {
          *(obuf++) = (ascii[(int) *buf] << 2 | ascii[(int) buf[1]] >> 4);
          *(obuf++) = (ascii[(int) buf[1]] << 4 | ascii[(int) buf[2]] >> 2);
          *(obuf++) = (ascii[(int) buf[2]] << 6 | ascii[(int) buf[3]]);
          buf += 4;
          nprbytes -= 4;
        }
      if (nprbytes > 1)
        *(obuf++) =
          (ascii[(int) *buf] << 2 | ascii[(int) buf[1]] >> 4);
      if (nprbytes > 2)
        *(obuf++) =
          (ascii[(int) buf[1]] << 4 | ascii[(int) buf[2]] >> 2);
      if (nprbytes > 3)
        *(obuf++) =
          (ascii[(int) buf[2]] << 6 | ascii[(int) buf[3]]);
      *(obuf)++ = '\0';
    }
    

    Ich fande letzten's diesen Code im Internet weil ich nen Code brauche der Wörte in Base64 kodiert,darauf hin fand ich diesen Code.
    Da ich jetzt nicht einfach Copy & Paste machen will,bitte ich euch mir den Code Zeile für Zeile zu erklären.
    Danke



  • Holgi schrieb:

    bitte ich euch mir den Code Zeile für Zeile zu erklären.

    das ist jetzt nicht dein ernst, oder?



  • Holgi schrieb:

    bitte ich euch mir den Code Zeile für Zeile zu erklären.

    Okay, dann mach ich mal den Anfang:

    Zeile  1: const char b64[] =
    

    Ein Konstanter char-Array namens b64 wird definiert
    und initialisiert mit ... (siehe nachfolgende Code-Zeilen-Erklärer)



  • Zeile  2: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    

    ... einem Zeichenkettenliteral.

    Wer macht mit der nächsten - trivialen - Zeile weiter? 😉

    cheers, Swordfish



  • die nächste zeile ist ein zeilenvorschub, welcher vom compiler als "whitespace" interpretiert und dementsprechend ignoriert wird

    edit:

    ein wenig hintergrundinformation: http://de.wikipedia.org/wiki/Zeilenvorschub



  • sothis_ schrieb:

    die nächste zeile wird in der regel als "whitespace" bezeichnet und wird vom compiler ignoriert

    Fast richtig, aber erst die übernächste Zeile ist "whitespace" 🕶

    Dann biete ich direkt auch die Erklärung zur zweiten Zeile an:

    Zeile  2: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    

    ... den Zeichen (in der angegebenen Reihenfolge)
    "A", danach
    "B", danach
    "C", danach
    "D", danach
    "E", danach
    "F", danach
    "G", danach
    "H", danach
    "I", danach
    "J", danach
    "K", danach
    "L", danach
    "M", danach
    "N", danach
    "O", danach
    "P", danach
    "Q", danach
    "R", danach
    "S", danach
    "T", danach
    "U", danach
    "V", danach
    "W", danach
    "X", danach
    "Y", danach
    "Z", danach
    "a", danach
    "b", danach
    "c", danach
    "d", danach
    "e", danach
    "f", danach
    "g", danach
    "h", danach
    "i", danach
    "j", danach
    "k", danach
    "l", danach
    "m", danach
    "n", danach
    "o", danach
    "p", danach
    "q", danach
    "r", danach
    "s", danach
    "t", danach
    "u", danach
    "v", danach
    "w", danach
    "x", danach
    "y", danach
    "z", danach
    "0", danach
    "1", danach
    "2", danach
    "3", danach
    "4", danach
    "5", danach
    "6", danach
    "7", danach
    "8", danach
    "9", danach
    "+", und schließlich
    "/"



  • Huch! Swordfish hat die nächste (2.) Zeile ja schon beantwortet.

    Dann halte ich mich ab jetzt lieber raus, bevor wir den Fragesteller noch verwirren! 😮



  • Javaner schrieb:

    ... den Zeichen (in der angegebenen Reihenfolge)

    [...]

    Swordfish schrieb:

    ... einem Zeichenkettenliteral.

    🙄

    Warum müsst ihr eine wunderschon begonnene Kette mutwillig zerstören? 👎 🤡

    cheers, Swordfish



  • in der dritten zeile steht nix drinn... 🤡 🤡 🤡 🤡

    so nächster.. 😃



  • in der 4. zeile steht

    char ascii[256] =
    


  • erklärer schrieb:

    in der 4. zeile steht

    char ascii[256] =
    

    Das ist aber keine Erklärung! 😡



  • So, nun aber bitte etwas mehr Disziplin... 😉

    Zeile  3:
    

    Nur Whitespaces.

    Zeile  4: char ascii[256] =
    

    Ein char Array "ascii" mit 256 Feldern wird definiert und initialisiert mit ...

    cheers, Swordfish



  • Swordfish schrieb:

    Zeile  3:
    

    Nur Whitespaces.

    Das ist aber keine Erklärung! 😡



  • Zeile  5: {
    

    eine öffnende geschweifte Klammer, die die folgenden Zahlen zu einem Array zusammenfasst...



  • Zeile  23:
    

    Nur Whitespaces.



  • Zeile  52:
    

    Nur Whitespaces.



  • Zeile 27: int i;
    

    Deklaration der lokalen int-Variablen i



  • Zeile  59:
    

    Nur Whitespaces.

    Zeile  61:
    

    Nur Whitespaces.



  • Zeile 53: void
    

    Beginn der Definition einer Funktion die void (also nichts) zurückliefert



  • Zeile 24: void
    

    Beginn der Definition einer Funktion die void (also nichts) zurückliefert


Anmelden zum Antworten