/*
    Public Base64 conversion tables
*/
unsigned char B64ABC[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
unsigned char b64buf[256];


/*
    void initb64();
    Initializes the base64->base16 conversion tab.
    Call this function once when your program starts.
    and always after your B64 table has been changed.
*/
void initb64(){
    unsigned int i;
    for (i=0; i<256; i++) b64buf[i]=0x00;
    for (i=0; i<64; i++) b64buf[(B64ABC[i])]=i;
}

/*
   int b64toh(lpBase64String, lpDestinationBuffer);
   Converts base64 string b to hexnumber d.
   Returns size of hexnumber in bytes.
*/
int b64toh(char *b, char *d){
    unsigned int i,k,l;

    l=strlen(b);
    if (l<2) return 0;
    for (i=l-1;i>-1;i--){
        if (b64buf[(b[i])]==0) l--;
        else break;
    }

    if (l<2) return 0;
    i=0, k=0;
    while (1) {
        i++;
        if (k+1<l) d[i-1]=((b64buf[(b[k])])<<2);
        else break;
        k++;
        if (k<l) d[i-1]|=((b64buf[(b[k])])>>4);
        else break;
        i++;
        if (k+1<l) d[i-1]=((b64buf[(b[k])])<<4);
        else break;
        k++;
        if (k<l) d[i-1]|=((b64buf[(b[k])])>>2);
        else break;
        i++;
        if (k+1<l) d[i-1]=((b64buf[(b[k])])<<6);
        else break;
        k++;
        if (k<l) d[i-1]|=(b64buf[(b[k])]);
        else break;
        k++;
    }
    return i-1;
}

/*
   int htob64(lpHexNumber, lpDestinationBuffer);
   Converts hexnumber h (with length l bytes) to base64 string d.
   Returns length of base64 string.
*/
int htob64(char *h, char *d, unsigned int l){
    unsigned int i,j,k;
    unsigned char m,t;

    if (!l) return 0;
    l<<=3;                              // no. bits
    m=0x80;
    for (i=0,j=0,k=0,t=0; i<l; i++){
        if (h[(i>>3)]&m) t|=1;
        j++;
        if (!(m>>=1)) m=0x80;
        if (!(j%6)) {
            d[k]=B64ABC[t];
            t&=0;
            k++;
        }
        t<<=1;
    }
    m=5-(j%6);
    t<<=m;
    if (m) {
        d[k]=B64ABC[t];
        k++;
    }
    d[k]&=0;
    return strlen(d);
}


syntax highlighted by Code2HTML, v. 0.9.1