#include #include #include typedef union { unsigned int data; unsigned char xyz[4]; } Union_data_t; static long codetovalue(unsigned char c) { if( (c >= (unsigned char)'A') && (c <= (unsigned char)'Z') ) { return (long)(c - (unsigned char)'A'); } else if( (c >= (unsigned char)'a') && (c <= (unsigned char)'z') ) { return ((long)(c - (unsigned char)'a') +26); } else if( (c >= (unsigned char)'0') && (c <= (unsigned char)'9') ) { return ((long)(c - (unsigned char)'0') +52); } else if( (unsigned char)'+' == c ) { return (long)62; } else if( (unsigned char)'/' == c ) { return (long)63; } else if( (unsigned char)'=' == c ) { return (long)0; } else { return -1; } } int decode_str(int enc_ptr, const unsigned char *src, unsigned char *dest) { int i, j; unsigned long base64 = 0; unsigned char x; Union_data_t bb; for (i = enc_ptr; i < enc_ptr + 4; i++) { x = codetovalue(src[i]); base64 |= x; if ((i - enc_ptr) != 3) base64 <<= 6; } base64 <<= 8; bb.data = base64; for(j = 0, i = 3; i >= 1; i--) { dest[j++] = bb.xyz[i]; } return 0; } int decode(const unsigned char *src, unsigned char *dest) { int x = 0, i = 0; int srclen; char tmp[4]; /* NULL pointer */ if (src == NULL) return -1; /**/ srclen = strlen(src); if (!srclen % 4) return -2; printf("srclen = %d, %d\n", srclen, srclen % 4); while(srclen) { memset(tmp, 0, sizeof(tmp)); decode_str(i, src, tmp); printf("i = %d, srclen = %d, tmp = %s\n", i, srclen, tmp); strcat(dest, tmp); i += 4; srclen -= 4; } printf("¡ú dest = %s\n", dest); return 0; } main() { char *src = "SGVsbG8="; char dest[100]; memset(dest, 0, sizeof(dest)); /**/ decode(src, dest); /**/ printf("dest = %s\n", dest); }