/*base64.c*/ #include "base64.h" char* base64_encode(const char* str) { long len; long str_len; char* res; int i, j; //¶¨Òåbase64±àÂë±í const char* base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; //¼ÆËã¾­¹ýbase64±àÂëºóµÄ×Ö·û´®³¤¶È str_len = strlen(str); if (str_len % 3 == 0) len = str_len / 3 * 4; else len = (str_len / 3 + 1) * 4; res =( char*) malloc(sizeof( char) * len + 1); res[len] = '\0'; //ÒÔ3¸ö8λ×Ö·ûΪһ×é½øÐбàÂë for (i = 0, j = 0; i < len - 2; j += 3, i += 4) { res[i] = base64_table[str[j] >> 2]; //È¡³öµÚÒ»¸ö×Ö·ûµÄǰ6λ²¢ÕÒ³ö¶ÔÓ¦µÄ½á¹û×Ö·û res[i + 1] = base64_table[(str[j] & 0x3) << 4 | (str[j + 1] >> 4)]; //½«µÚÒ»¸ö×Ö·ûµÄºóλÓëµÚ¶þ¸ö×Ö·ûµÄǰ4λ½øÐÐ×éºÏ²¢ÕÒµ½¶ÔÓ¦µÄ½á¹û×Ö·û res[i + 2] = base64_table[(str[j + 1] & 0xf) << 2 | (str[j + 2] >> 6)]; //½«µÚ¶þ¸ö×Ö·ûµÄºó4λÓëµÚÈý¸ö×Ö·ûµÄǰ2λ×éºÏ²¢ÕÒ³ö¶ÔÓ¦µÄ½á¹û×Ö·û res[i + 3] = base64_table[str[j + 2] & 0x3f]; //È¡³öµÚÈý¸ö×Ö·ûµÄºó6λ²¢ÕÒ³ö½á¹û×Ö·û } switch (str_len % 3) { case 1: res[i - 2] = '='; res[i - 1] = '='; break; case 2: res[i - 1] = '='; break; } return res; } char* base64_decode(const char* code) { //¸ù¾Ýbase64±í£¬ÒÔ×Ö·ûÕÒµ½¶ÔÓ¦µÄÊ®½øÖÆÊý¾Ý int table[] = { 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,62,0,0,0, 63,52,53,54,55,56,57,58, 59,60,61,0,0,0,0,0,0,0,0, 1,2,3,4,5,6,7,8,9,10,11,12, 13,14,15,16,17,18,19,20,21, 22,23,24,25,0,0,0,0,0,0,26, 27,28,29,30,31,32,33,34,35, 36,37,38,39,40,41,42,43,44, 45,46,47,48,49,50,51 }; long len; long str_len; char* res; int i, j; //¼ÆËã½âÂëºóµÄ×Ö·û´®³¤¶È len = strlen(code); //ÅжϱàÂëºóµÄ×Ö·û´®ºóÊÇ·ñÓÐ= if (strstr(code, "==")) str_len = len / 4 * 3 - 2; else if (strstr(code, "=")) str_len = len / 4 * 3 - 1; else str_len = len / 4 * 3; res = ( char*)malloc(sizeof( char) * str_len + 1); res[str_len] = '\0'; //ÒÔ4¸ö×Ö·ûΪһλ½øÐнâÂë for (i = 0, j = 0; i < len - 2; j += 3, i += 4) { res[j] = ((unsigned char)table[code[i]]) << 2 | (((unsigned char)table[code[i + 1]]) >> 4); //È¡³öµÚÒ»¸ö×Ö·û¶ÔÓ¦base64±íµÄÊ®½øÖÆÊýµÄǰ6λÓëµÚ¶þ¸ö×Ö·û¶ÔÓ¦base64±íµÄÊ®½øÖÆÊýµÄºó2λ½øÐÐ×éºÏ res[j + 1] = (((unsigned char)table[code[i + 1]]) << 4) | (((unsigned char)table[code[i + 2]]) >> 2); //È¡³öµÚ¶þ¸ö×Ö·û¶ÔÓ¦base64±íµÄÊ®½øÖÆÊýµÄºó4λÓëµÚÈý¸ö×Ö·û¶ÔÓ¦bas464±íµÄÊ®½øÖÆÊýµÄºó4λ½øÐÐ×éºÏ res[j + 2] = (((unsigned char)table[code[i + 2]]) << 6) | ((unsigned char)table[code[i + 3]]); //È¡³öµÚÈý¸ö×Ö·û¶ÔÓ¦base64±íµÄÊ®½øÖÆÊýµÄºó2λÓëµÚ4¸ö×Ö·û½øÐÐ×éºÏ } return res; }