Base64编码的实现(c++) 仅编码部分

来源:互联网 发布:相宜本草红景天 知乎 编辑:程序博客网 时间:2024/05/30 22:53
//Base64编码:每三个字节将编码为四个字节,每次编码取6bit作为新8bit的后六位,前两位填0 

string ZBase64::Encode(const unsigned char* Data,int DataByte)
{
 //编码表
 const char EncodeTable[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

 //返回值
 string strEncode;

 unsigned char Tmp[3]={0};
 int LineLength=0;

 for(int i=0;i<(int)(DataByte / 3);i++)
 {
        Tmp[1] = *Data++;
        Tmp[2] = *Data++;
        Tmp[3] = *Data++;

        strEncode+= EncodeTable[Tmp[1] >> 2];
        strEncode+= EncodeTable[((Tmp[1] << 4) | (Tmp[2] >> 4)) & 0x3F];
        strEncode+= EncodeTable[((Tmp[2] << 2) | (Tmp[3] >> 6)) & 0x3F];
        strEncode+= EncodeTable[Tmp[3] & 0x3F];
  if(LineLength+=4,LineLength==76) {strEncode+="\r\n";LineLength=0;}
 }

 //对剩余数据进行编码
 int Mod=DataByte % 3;
 if(Mod==1)
 {
        Tmp[1] = *Data++;
        strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];
        strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4)];
        strEncode+= "==";
 }
 else if(Mod==2)
 {
  Tmp[1] = *Data++;
  Tmp[2] = *Data++;
  strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];
  strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4) | ((Tmp[2] & 0xF0) >> 4)];
  strEncode+= EncodeTable[((Tmp[2] & 0x0F) << 2)];
  strEncode+= "=";
 }
 
 return strEncode;
}