Ergebnis 1 bis 2 von 2

Thema: [C] Base64

  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)

  3. #2
    Stanley Jobson Avatar von GregorSamsa
    Registriert seit
    23.08.2008
    Beiträge
    729

    Standard

    Unordentlich finde ich das jetzt nicht.

    Und danke, sowas kann man immermal gebrauchen!

Stichworte

Berechtigungen

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