[Ffmpeg-devel] [PATCH] Base64 code

Michael Niedermayer michaelni
Fri Oct 27 20:47:41 CEST 2006


Hi

On Fri, Oct 27, 2006 at 11:49:33AM -0500, Ryan Martell wrote:
> Attached are two files for libavformat, base64.c & h.
> 
> I took the b64_encode from http.c, and then implemented the  
> b64_decode (per Michael's suggestions).
> 
> I modified the b64_encode to make it comply with the specification  
> (sometimes it needs two == on the end), and to not take strings as  
> input (since it should be encoding data, not strings).
> 
> The http.c stuff could have had authentication problems before, due  
> to the == issues.
> 
> The large chunk of code at the bottom is for testing, and is #ifdef'd  
> out.  If anyone has any other edge cases that they would like me to  
> check on, I will.
> 
> If these are accepted, I will submit a separate patch for the  
> Makefile and http.c to make it use this code.

[...]

> #include "avformat.h"

why is this needed?


> #include "base64.h"
> 
> /* ---------------- private code */
> static uint8_t map2[] =
>     { 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
>     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
>         0xff, 0xff,
>     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
>     0xff, 0xff,
>     0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f, 0x34, 0x35, 0x36,
>     0x37, 0x38,
>     0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
>     0x00, 0x01,
>     0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
>     0x0e, 0x0f,
>     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xff, 0xff,
>     0xff, 0xff,
>     0xff, 0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
>     0x24, 0x25,
>     0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
>     0x32, 0x33,
>     0xff, 0xff, 0xff, 0xff, 0xff
> };
> 
> int b64_decode(uint8_t * out, const char *in, int out_length)

both functions should have a av_ prefix, theres a pretty good chance another
application or lib might have a b64_decode() and if so the linker would vomit


> {
>     int i, v;
>     uint8_t *dst = out;
> 
>     v = 0;
>     for (i = 0; in[i] && in[i] != '='; i++) {
>         if (in[i] < 0 || map2[(int) in[i]] == 0xff)
>             return -1;

char is unsigned on some platforms (the in[i] < 0 would be false and
map2[(int) in[i]] would be outside of the array)


>         v = (v << 6) + map2[(int) in[i]];
>         if (i & 3) {
>             if (dst - out < out_length) {
>                 *dst++ = v >> (6 - 2 * (i & 3));
>             }
>         }
>     }
> 
>     return (dst - out);

what about

static uint8_t map2[80] = {
                      0x3e, 0xff, 0xff, 0xff, 0x3f,
    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
    0x3c, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
    0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
    0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
    0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
    0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
    0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
    0x31, 0x32, 0x33
};

int av_b64_decode(uint8_t * out, const char *in, int out_length){
    int i, v;
    uint8_t *dst = out;

    v = 0;
    for (i = 0; in[i] && in[i] != '='; i++) {
        unsigned int ndx= in[i]-43;
        if (ndx > 79U || map2[ndx] == 0xff)
            return -1;
        v = (v << 6) + map2[ndx];
        if (i & 3) {
            if (dst - out < out_length) {
                *dst++ = v >> (6 - 2 * (i & 3));
            }
        }
    }

    return (dst - out);
}

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

In the past you could go to a library and read, borrow or copy any book
Today you'd get arrested for mere telling someone where the library is




More information about the ffmpeg-devel mailing list