[Original]
Const unsigned char base64table [64] = <br/>{< br/> 'A', 'B', 'C', 'D', 'E ', 'F', 'G', 'h', 'I', 'J', 'k', 'l', 'M', 'n', 'O ', 'P', <br/> 'Q', 'R', 's', 't', 'U', 'V', 'w', 'x ', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', <br/> 'G ', 'H', 'I', 'J', 'k', 'l', 'M', 'n', 'O', 'P', 'Q ', 'R', 's', 't', 'U', 'V', <br/> 'w', 'x', 'y', 'z ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9 ', '+', '/' <br/> }; </P> <p> const unsigned char base64rtable [128] = <br/>{</P> <p> 0xff, 0xff, 0x FF, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, <br/> 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, <br/> 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f, <br/> 0x34,0x35,0x36,0x37,0x38,0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, <br/> 0xff, 0 x, 0x0, 0 x, 0 x, 0x09, 0x0a, 0x0b, 0x0 C, 0x0d, 0x0e, <br/> 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,0x15, 0x16, 0x17,0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, <br/> 0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x24, 0x25, 0x26, 0x27,0x28, <br/> 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,0x32, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff <br/> }; </P> <p> unsigned long <br/> base64encode (<br/> const unsigned char * psrc, <br/> unsigned long size, <br/> unsigned char * de St, <br/> unsigned long * psize) <br/> {<br/> If (psrc = NULL | size = 0) <br/> return 0; <br/> If (* psize = 0) <br/> {<br/> If (size % 3 = 0) <br/>{< br/> * psize = (size/3) * 4; <br/>}< br/> else <br/> {<br/> * psize = (size/3) * 4 + 4; <br/>}< br/> return 1; <br/>}</P> <p> const unsigned char * ptable = base64table; <br/> const unsigned char * PS = psrc; <br/> unsigned char * Pd = pdest; <br/> unsigned long mod = size % 3; </P> <p> If (mod = 0) <br/> {<br/> while (unsigned long) (PS-psrc) <size) <br/>{< br/> * Pd = * (ptable + (* PS> 2) & 0x3f); <br/> PD ++; <br/> * Pd = * (ptable + (* ps <4) + (* (PS + 1)> 4) & 0x3f )); <br/> PD ++; <br/> * Pd = * (ptable + (* (PS + 1) <2) + (* (PS + 2)> 6) & 0x3f); <br/> PD ++; <br/> * Pd = * (ptable + (* (PS + 2) & 0x3f); <br/> PD ++; </P> <p> PS + = 3; <br/>}< br/> else <br/>{< br/> while (unsigned Long) (PS-psrc) <size-mod) <br/>{< br/> * Pd = * (ptable + (* PS> 2) & 0x3f); <br/> PD ++; <br/> * Pd = * (ptable + (* ps <4) + (* (PS + 1)> 4) & 0x3f); <br/> PD ++; <br/> * Pd = * (ptable + (* (PS + 1) <2) + (* (PS + 2)> 6 )) & 0x3f); <br/> PD ++; <br/> * Pd = * (ptable + (* (PS + 2) & 0x3f )); <br/> PD ++; </P> <p> PS + = 3; <br/>}</P> <p> unsigned char buff [16] = {0}; <br/> memcpy_s (buff, 16, PS, MoD ); <br/> unsigned char * P = Bu Ff; </P> <p> If (mod = 1) <br/> {<br/> * Pd = * (ptable + (* P> 2) & 0x3f); <br/> PD ++; <br/> * Pd = * (ptable + (* P <4) + (* (p + 1)> 4) & 0x3f); <br/> PD ++; <br/> * Pd = '; <br/> * PD ++; <br/> * Pd = '; <br/>}< br/> else if (mod = 2) <br/>{< br/> * Pd = * (ptable + (* P> 2) & 0x3f); <br/> PD ++; <br/> * Pd = * (ptable + (* P <4) + (* (p + 1)> 4) & 0x3f )); <br/> PD ++; <br/> * Pd = * (ptable + (* (p + 1) <2) + (* (p + 2)> 6) & 0x3f); <br/> PD ++; <br/> * Pd = '; <br/>}</P> <p> return 1; <br/>}</P> <p> unsigned long <br/> base64decode (<br/> const char * psrc, <br/> unsigned long size, <br/> unsigned char * pdest, <br/> unsigned long * psize) <br/>{< br/> If (psrc = NULL | size = 0 ||( (size % 4 )! = 0) <br/> return 0; </P> <p> If (* psize = 0) <br/>{< br/> * psize = (size/4) * 3; <br/> return 1; <br/>}< br/> const unsigned long ul4 = 4; </P> <p> const unsigned char * ptable = base64rtable; <br/> const char * PS = psrc; <br/> unsigned char * Pd = pdest; <br/> unsigned long realsize = 0; <br/> unsigned long mod = 0; </P> <p> const char * pequal = NULL; <br/> pequal = strchr (psrc, '= '); <br/> If (pequal = NULL) <br/>{< br/> realsize = size; <br/>}< br/> else <br/> {<br/> realsize = (unsigned long) (pequal-psrc ); <br/>}< br/> mod = realsize % 4; </P> <p> If (mod = 0) <br/>{< br/> while (unsigned long) (PS-psrc) <realsize) <br/> {<br/> * Pd = (* (ptable + * PS) <2) + (* (ptable + * (PS + 1)> 4); <br/> PD ++; <br/> * Pd = (* (ptable + * (PS + 1) <4) + (* (ptable + * (PS + 2)> 2); <br/> PD ++; <br/> * Pd = (* (ptable + * (PS + 2) <6) + (* (ptable + * (PS + 3 ))); <br/> PD ++; </P> <p> PS + = 4; <br/>}< br/> else <br/> {<br/> while (unsigned long) (PS-psrc) <size-ul4) <br/> {<br/> * Pd = (* (ptable + * PS) <2) + (* (ptable + * (PS + 1)> 4); <br/> PD ++; <br/> * Pd = (* (ptable + * (PS + 1) <4) + (* (ptable + * (PS + 2)> 2); <br/> PD ++; <br/> * Pd = (* (ptable + * (PS + 2) <6) + (* (ptable + * (PS + 3 ))); <br/> PD ++; </P> <p> PS + = 4; <br/>}</P> <p> unsigned long uequal = size-realsize; </P> <p> char buff [16] = {0}; <br/> memcpy_s (buff, 16, PS, ul4-uequal ); <br/> char * P = Buff; </P> <p> If (uequal = 1) <br/> {<br/> * Pd = (* (ptable + * P) <2) + (* (ptable + * (p + 1)> 4); <br/> PD ++; <br/> * Pd = (* (ptable + * (p + 1) <4) + (* (ptable + * (p + 2)> 2); </P> <p >}< br/> else if (uequal = 2) <br/> {<br/> * Pd = (* (ptable + * P) <2) + (* (ptable + * (p + 1)> 4); </P> <p >}< br/>}</P> <p> return 1; <br/>}