#include<stdio.h> #include<string.h> #include<stdlib.h> char Base64Code[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T', 'U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n', 'o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7', '8','9','+','/','=','/0'}; typedef unsigned char byte; //in 是以'/0'结尾的字符串 //输出的也是一个字符串 //将字符串编码成Base64码 char* encript(char in[], int length) { //将in数组元素个数变为3的整数倍 int newSize = length + (length%3==0?0:3-length%3); char *out = (char*)malloc(newSize*2); memset(out, 0, newSize*2); byte *inChange = (byte*)malloc(newSize); int i; for (i=0; i<length; ++i) inChange[i] = in[i]; for (i=length; i<newSize; ++i) inChange[i] = 0; int groupSize = newSize/3;//以3个字节即24位一组,划分 for (i=0; i<groupSize; ++i) { //获取分组 byte group[3]; group[0] = inChange[i*3]; group[1] = inChange[i*3+1]; group[2] = inChange[i*3+2]; //求出4个6位组 byte groupOut[4]; groupOut[0] = group[0]>>2; groupOut[1] = (((group[0]<<4)&0x3f) | (group[1]>>4)); groupOut[2] = (((group[1]<<2)&0x3f) | (group[2]>>6)); if (group[1]==(byte)0) groupOut[2] = 64; groupOut[3] = group[2] & 0x3f; if (group[2]==(byte)0) groupOut[3] = 64; for (int j=0; j<4; ++j) { char str[2]; sprintf(str, "%c", Base64Code[groupOut[j]]); strcat(out, str); } } free(inChange); return out; } //将Base64编码解码 char* decript(char message[], int length) { int groupSize = length/4; char *out = (char*)malloc(length); memset(out, 0, length); int i = 0; for (i=0; i<groupSize; ++i) { byte group[4]; group[0] = (byte)(strchr(Base64Code, message[i*4])-Base64Code); group[1] = (byte)(strchr(Base64Code, message[i*4+1])-Base64Code); group[2] = (byte)(strchr(Base64Code, message[i*4+2])-Base64Code); group[3] = (byte)(strchr(Base64Code, message[i*4+3])-Base64Code); char groupOut[3]; groupOut[0] = ((group[0]<<2) | ((group[1]>>4)&0x03)); groupOut[1] = ((group[1]<<4) | ((group[2]>>2)&0x0f)); if (group[2]==64) groupOut[1] = 0; groupOut[2] = ((group[2]<<6) | ((group[3])&0x3f)); if (group[3]==64) groupOut[2] = 0; for (int j=0; j<3; ++j) { char str[2]; sprintf(str, "%c", (char)groupOut[j]); strcat(out, str); } } return out; }