Ergebnis 1 bis 2 von 2

Thema: [C] Base64

Baum-Darstellung

  1. #1
    Edelgas Avatar von krypt0n
    Registriert seit
    31.03.2010
    Beiträge
    247

    Standard [C] Base64

    Code:
    static inline unsigned char _uchar(char ch)
    {
        return ch;
    }
    
    unsigned char *base64_encode(const unsigned char *src, size_t len, size_t *out_len)
    {
        /* list of valid base 64 chars */
        static const unsigned char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
        unsigned char *out;
        unsigned char *pos;
    
        *out_len = len + (len / 3) + (len % 3 > 0 ? 1 : 0) + 1;
    
        out = malloc(*out_len);
        if (out == NULL)
            return NULL;
    
        pos = out - 1;
    
        while (len) {
            /* first 6 bytes */
            *++pos = b64[(_uchar(src[0]) >> 2) & 0x3f];
    
            if (!--len) {
                *++pos = b64[(_uchar(src[0]) << 4) & 0x3f];
                break;
            }
            else
                *++pos = b64[((_uchar(src[0]) << 4) +
                              (_uchar(src[1]) >> 4)) &
                              0x3f];
    
            if (!--len) {
                *++pos = b64[(_uchar(src[1]) << 2) & 0x3f];
                break;
            }
            else
                *++pos = b64[((_uchar(src[1]) << 2) +
                              (_uchar(src[2]) >> 6)) &
                              0x3f];
    
            if (!len--)
                break;
    
            *++pos = b64[_uchar(src[2]) & 0x3f];
    
            src += 3;
        }
    
        *++pos = '\0';
    
        return out;
    }
    
    unsigned char *base64_decode(const unsigned char *src, size_t len, size_t *out_len)
    {
        /* list of valid base 64 chars */
        static const unsigned char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
        unsigned char *out,
                      *pos;
    
        *out_len = len;
    
        out = malloc(*out_len);
        if (out == NULL)
            return NULL;
    
        pos = out - 1;
    
        while (len) {
            if (!strchr(b64, src[0]) || !strchr(b64, src[1]))
                break;
    
            *++pos = (((int)strchr(b64, src[0]) - (int)b64) << 2) + (((int)strchr(b64, src[1]) - (int)b64) >> 4);
    
            if (!--len)
                break;
    
            if (!strchr(b64, src[2]))
                break;
    
            *++pos = (((int)strchr(b64, src[1]) - (int)b64) << 4) + (((int)strchr(b64, src[2]) - (int)b64) >> 2);
    
            if (!--len || !--len)
                break;
    
            if (!strchr(b64, src[3]))
                break;
    
            *++pos = (((int)strchr(b64, src[2]) - (int)b64) << 6) + (((int)strchr(b64, src[3]) - (int)b64));
    
            len--;
            src += 4;
        }
    
        *++pos = '\0';
    
        // set real size
        *out_len = pos - out + 1;
        pos = realloc(out, *out_len);
        if (pos == NULL)
            return NULL;
    
        out = pos;
    
        return out;
    }
    Habe gerade noch ein älteres Snipet einer Base64 Funktion von mir gefunden. AFAIK habe ich kurz eine kleine base64 Funktion gebraucht und diese Nachher mit irgend nem anderen Snippet noch ein bisschen gepimpt. Insgesamt ist es etwas unordentlich, aber das ganze funktioniert immerhin (zumindest bei meinem kurzen Test vorhin).
    You've been krypt0nized!

  2. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    GregorSamsa (08.04.2010)

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •