00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include <new.h>
00040
00041 #ifdef HAVE_CONFIG_H
00042 #include <config.h>
00043
00044 #endif
00045 #include <stdlib.h>
00046 #include <string.h>
00047 #include "base64.h"
00048
00049 #pragma warning (disable: 4244)
00050
00051 static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
00052
00053 static int pos(char c)
00054 {
00055 char *p;
00056 for(p = base64; *p; p++)
00057 if(*p == c)
00058 return p - base64;
00059 return -1;
00060 }
00061
00062 int base64_encode(const void *data, int size, char **str)
00063 {
00064 char *s, *p;
00065 int i;
00066 int c;
00067 unsigned char *q;
00068
00069 p = s = new char [size*4/3+4];
00070 if (p == NULL)
00071 return -1;
00072 q = (unsigned char*)data;
00073 i=0;
00074 for(i = 0; i < size;){
00075 c=q[i++];
00076 c*=256;
00077 if(i < size)
00078 c+=q[i];
00079 i++;
00080 c*=256;
00081 if(i < size)
00082 c+=q[i];
00083 i++;
00084 p[0]=base64[(c&0x00fc0000) >> 18];
00085 p[1]=base64[(c&0x0003f000) >> 12];
00086 p[2]=base64[(c&0x00000fc0) >> 6];
00087 p[3]=base64[(c&0x0000003f) >> 0];
00088 if(i > size)
00089 p[3]='=';
00090 if(i > size+1)
00091 p[2]='=';
00092 p+=4;
00093 }
00094 *p=0;
00095 *str = s;
00096 return strlen(s);
00097 }
00098
00099 int base64_decode(const char *str, void *data)
00100 {
00101 const char *p;
00102 unsigned char *q;
00103 int c;
00104 int x;
00105 int done = 0;
00106 q=(unsigned char*)data;
00107 for(p=str; *p && !done; p+=4){
00108 x = pos(p[0]);
00109 if(x >= 0)
00110 c = x;
00111 else{
00112 done = 3;
00113 break;
00114 }
00115 c*=64;
00116
00117 x = pos(p[1]);
00118 if(x >= 0)
00119 c += x;
00120 else
00121 return -1;
00122 c*=64;
00123
00124 if(p[2] == '=')
00125 done++;
00126 else{
00127 x = pos(p[2]);
00128 if(x >= 0)
00129 c += x;
00130 else
00131 return -1;
00132 }
00133 c*=64;
00134
00135 if(p[3] == '=')
00136 done++;
00137 else{
00138 if(done)
00139 return -1;
00140 x = pos(p[3]);
00141 if(x >= 0)
00142 c += x;
00143 else
00144 return -1;
00145 }
00146 if(done < 3)
00147 *q++=(c&0x00ff0000)>>16;
00148
00149 if(done < 2)
00150 *q++=(c&0x0000ff00)>>8;
00151 if(done < 1)
00152 *q++=(c&0x000000ff)>>0;
00153 }
00154 return q - (unsigned char*)data;
00155 }
00156