using System;
using System.Text;
using System.Collections;
using Shaka.Common;
namespace Shaka.Encrypt.Mine
{
/// <summary>
/// 
/// </summary>
public class myBase64
{
char[] Base64Code=new char[]{'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','+','/','='};
public myBase64()
{
}

#region Base64编码
/// <summary>
/// Base64编码
/// </summary>
/// <param name="pStrSrc"></param>
/// <returns></returns>
public string Base64Encoder(string pStrSrc)
{
// 编码规则
//         Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。
//        它将需要编码的数据拆分成字节数组。以3个字节为一组。
// 按顺序排列24位数据,再把这24位数据分成4组,即每组6位。
// 再在每组的的最高位前补两个0凑足一个字节。
// 这样就把一个3字节为一组的数据重新编码成了4个字节。
// 当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。
// 这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个“=”。 ArrayList arrList = new ArrayList(Encoding.Default.GetBytes(pStrSrc));
string strBinaryString = "";
int iLoopCount = 0;
string strRetureValue = "";
int iEqualNum = 0; #region 补       零
switch(arrList.Count % 3)
{
case 1 : 
{
arrList.Add(0);
arrList.Add(0);
iEqualNum = 2;
break;
}
case 2:
{
arrList.Add(0);
iEqualNum = 1;
break;
}
default : break;
}
#endregion

// 转化成二进制形式的字符串
for(int i = 0 ; i < arrList.Count ; i ++)
{
strBinaryString += Number.ToBinary(Convert.ToInt32(arrList[i]));
}
// 确定循环次数
iLoopCount = strBinaryString.Length / 6;
for(int i = 0 ; i < iLoopCount ; i ++)
{
int[] iBase64 = new int[iLoopCount];
strRetureValue += Base64Code[Number.ToInt((strBinaryString.Substring(i * 6  , 6)))];
}
// 加等号
if(iEqualNum == 1)
{
strRetureValue = strRetureValue.Remove(strRetureValue.Length - 1 , 1);
strRetureValue = strRetureValue.Insert(strRetureValue.Length , "=");
}
else if(iEqualNum == 2)
{
strRetureValue = strRetureValue.Remove(strRetureValue.Length - 2 , 2);
strRetureValue = strRetureValue.Insert(strRetureValue.Length , "=");
strRetureValue = strRetureValue.Insert(strRetureValue.Length , "=");
}
return strRetureValue;
}
#endregion #region Base64解码
/// <summary>
/// Base64解码
/// </summary>
/// <param name="pStrBase64String"></param>
/// <returns></returns>
public string Base64Decoder(string pStrBase64String)
{
#region 编码过程演示
// char[] Base64Code
// =new char[]{
// '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','+','/','='};
// abcd
// 011000 010110 001001 100011 011001 000000 000000 000000
// 00011000 00010110 00001001 00100011 00011001 00000000 00000000 00000000
// 24       22       9        35       25       0        0        0
// Y        W        J        j        Z        A        A        A 
// YWJjZAAA
// YWJjZA
// YWJjZA==
#endregion #region 解码过程推理
// 检查密文尾部等号"="的个数 记下这个个数
// 把等号换成A("=" => "0" => Base64Code[0]= 'A')
// 在数据字典中寻找字符 记下索引号
// 索引号转二进制连接起来
// 去掉末尾的8位或16位的二进制0
// 每八位取二进制数据 转换成字符
// 连接每个字符
// 完成
#endregion
int iEqualCount = 0;
string strReturnValue = "";
if(pStrBase64String.Substring(pStrBase64String.Length - 2 , 1) == "=")
{
iEqualCount = 2;
pStrBase64String = pStrBase64String.Remove(pStrBase64String.Length - 2 , 2);
pStrBase64String = pStrBase64String.Insert(pStrBase64String.Length , "A");
pStrBase64String = pStrBase64String.Insert(pStrBase64String.Length , "A");

}
else if(pStrBase64String.Substring(pStrBase64String.Length - 1 , 1) == "=")
{
iEqualCount = 1;
pStrBase64String = pStrBase64String.Remove(pStrBase64String.Length - 1 , 1);
pStrBase64String = pStrBase64String.Insert(pStrBase64String.Length , "A");
}
ArrayList arrIndex = new ArrayList();
for(int i = 0 ; i < pStrBase64String.Length ; i ++)
{
for(int j = 0 ; j < 64 ; j ++)
{
if(pStrBase64String.Substring(i , 1) == Base64Code[j].ToString())
{
arrIndex.Add(j);
break;
}
}
}
string strBinaryString = "";
string strTmp = "";
for(int i = 0 ; i < arrIndex.Count ; i ++)
{
strTmp = Number.ToBinary(Convert.ToInt32(arrIndex[i])).Remove(0 , 2);
strBinaryString += strTmp;
}
if(iEqualCount == 1)
{strBinaryString = strBinaryString.Remove(strBinaryString.Length - 8 , 8);}
else if(iEqualCount == 2)
{strBinaryString = strBinaryString.Remove(strBinaryString.Length - 16 , 16);}
for(int i = 0 ; i < strBinaryString.Length / 8 ; i ++)
{
strReturnValue += Convert.ToChar(Number.ToInt(strBinaryString.Substring(i * 8 , 8))).ToString();
}
return strReturnValue;
}
#endregion
}
}

解决方案 »

  1.   

    using System;namespace Shaka.Common
    {
    /// <summary>
    /// 
    /// </summary>
    public class Number
    { #region 二进制字符串不足八位的补零
    /// <summary>
    /// 二进制字符串不足八位的补零
    /// </summary>
    /// <param name="pStrSource"></param>
    /// <returns></returns>
    public static string Fill(string pStrSource)
    {
    switch(pStrSource.Length)
    {
    case 1:return "0000000" + pStrSource;
    case 2:return "000000"  + pStrSource;
    case 3:return "00000"    + pStrSource;
    case 4:return "0000"     + pStrSource;
    case 5:return "000"       + pStrSource;
    case 6:return "00"        + pStrSource;
    case 7:return "0"          + pStrSource;
    default:return pStrSource;
    }
    }
    #endregion #region Int32 Cnvert To Binary String
    /// <summary>
    /// Int32 Cnvert To Binary String
    /// </summary>
    /// <param name="piNumber"></param>
    /// <returns></returns>
    public static String ToBinary(int piNumber)
    {
    string strBinary = "";
    int iTmp;
    do
    {
    iTmp = piNumber % 2;
    strBinary = iTmp.ToString() + strBinary;
    piNumber = piNumber /2;
    }while(piNumber != 0);
    return Fill(strBinary);
    }
    #endregion #region Int64 Convert To Binary String
    /// <summary>
    /// Int64 Convert To Binary String
    /// </summary>
    /// <param name="plNumber"></param>
    /// <returns></returns>
    public static String ToBinary(long plNumber)
    {
    string strBinary = "";
    long iTmp;
    do
    {
    iTmp = plNumber % 2;
    strBinary = iTmp.ToString() + strBinary;
    plNumber = plNumber /2;
    }while(plNumber != 0);
    return strBinary;
    }
    #endregion #region 二进制字符串转换为整形
    /// <summary>
    /// 二进制字符串转换为整形
    /// </summary>
    /// <param name="pStrBinary"></param>
    /// <returns></returns>
    public static int ToInt(string pStrBinary)
    {
    char[] charArr = pStrBinary.ToCharArray();
    int iReturnValue = 0;
    int iPow = 0;
    for(int i = 0 ; i < charArr.Length ; i ++)
    {
    if(charArr[i].ToString() != "0" && charArr[i].ToString() != "1")
    {throw new Exception("输入字符串格式不正确!");}
    }
    for(int i = 0 ; i < charArr.Length  ; i ++)
    {
    iPow = Convert.ToInt32(charArr[i].ToString());
    iReturnValue += iPow * Convert.ToInt32(Math.Pow(2 , charArr.Length - i - 1));
    }
    return iReturnValue;
    }
    #endregion
    }
    }
      

  2.   

    我写的代码就是Convert.ToBase64String()方法的实现过程