1. BASE64算法原理:

base64编码规则

     A.采用64个基本的ASCII码字符对数据进行重新编码

3个字节为一组按顺序排列24 位数据

   C.把24位数据分成4组,每组6位,每组最高位前补两个0凑足一个字节,

        3字节为一组的数据重新编码成4个字节数据

   D.若编码的数据的字节数不能被3整除,即最后一组不足3字节,

        为最后一组填充1到2个0字节,编码完成后在结尾添加1到2个 “=”,

        补多少个0,就加多少个=

编码示例

BASE64算法原理解析之C#实现_ascii码

BASE编码思路:

1. 取字符串的ASCII码整数值

2.转换字符串ASCII码整数值为二进制

3.创建一个3字节数组,每次取字符串3个字节,如果不足用0填充

4.最后将上面的3字节数组全部转换为二进制字符串并接成24位数据(1字节8位) 

5.将上面的24位数据分割成4组,每组取6位,然后在最左边加上2个0变成一个8位,相当一个字节

6.将上面补全8位的四组都转换为字节,最后转换成整数,根据整数去base64字符表取对应索引字符,

   第3步补0的不用取,直接返回=号

7.如果上面第3步补多少个0,最后编码补一样多的=

下面是完整的C#代码:

var bytes = Encoding.ASCII.GetBytes("A");//字符串转换位集合
Console.WriteLine("字符串长度:{0}",bytes.Length);//字符串长度
Console.WriteLine("A的ASCII码: {0}",(int)bytes[0]);//字符位转换整数
Console.WriteLine("byte转char: {0}",(char)bytes[0]);//整数转换字符位
string b = Convert.ToString((int)bytes[0], 2).PadLeft(8, '0');//整数转换为二进制
Console.WriteLine("A的ASCII码转换为二进制:{0} ",b);
//8位转6位
var baseBytes = new byte[3];
Console.WriteLine("默认8转6转换位:{0},{1},{2}", baseBytes[0], baseBytes[1], baseBytes[2]);
baseBytes[0] = bytes[0];
var b0 = Convert.ToString((int)baseBytes[0], 2).PadLeft(8, '0');
var b1 = Convert.ToString((int)baseBytes[1], 2).PadLeft(8, '0');
var b2 = Convert.ToString((int)baseBytes[2], 2).PadLeft(8, '0');
Console.WriteLine("填充数据后:{0},{1},{2}",b0,b1,b2);

var threeBitsString = b0 + b1 + b2;
Console.WriteLine("拼接3个8位二进制数据: {0}", threeBitsString);//010000 010000 000000 000000
//转换成4个6位,然后转换成整数
var p1 = threeBitsString.Substring(0,6);
var p2 = threeBitsString.Substring(6, 6);
var p3 = threeBitsString.Substring(12,6);
var p4 = threeBitsString.Substring(18,6);
Console.Write("转换成4个6位: {0}-{1}-{2}-{3}\n", p1,p2,p3,p4);
Console.WriteLine("BASE64: {0}{1}{2}{3}",alph[Convert.ToInt32(p1,2)], alph[Convert.ToInt32(p2, 2)],"=","=");

BASE64编码多个字符完整源码:

/// <summary>
/// 字符串转换成二进制拼接字符串
/// </summary>
/// <param name="toEncodeString"></param>
/// <returns></returns>
static String Base64Encode(String toEncodeString)
{
var byteArray = Encoding.ASCII.GetBytes(toEncodeString);
int len = toEncodeString.Length;
var s = new StringBuilder();
var t = new StringBuilder();
var base64Str = string.Empty;
//取满足3字节,先编码
for (int i = 0; i < len/3; i++)
{
var b1 = byteArray[i * 3]; //第1个字节
var b2 = byteArray[i * 3+1]; //第2个字节
var b3 = byteArray[i * 3+2]; //第3个字节

s.Append(Convert.ToString((int)b1, 2).PadLeft(8, '0'));
s.Append(Convert.ToString((int)b2, 2).PadLeft(8, '0'));
s.Append(Convert.ToString((int)b3, 2).PadLeft(8, '0'));

var data = s.ToString();
s.Clear();

//转换成4个6位,然后转换成整数
var p1 = data.Substring(0, 6);
var p2 = data.Substring(6, 6);
var p3 = data.Substring(12, 6);
var p4 = data.Substring(18, 6);

//编码一组3个字节为4字节
base64Str = alph[Convert.ToInt32(p1, 2)].ToString() + alph[Convert.ToInt32(p2, 2)].ToString() +
alph[Convert.ToInt32(p3, 2)].ToString() + alph[Convert.ToInt32(p4, 2)].ToString();

t.Append(base64Str);

}

//处理不足3字节数据
if (len % 3 > 0)
{
var lastGroupLen = len % 3;
var tmpBytes = new byte[3];
if (lastGroupLen == 1)
{
tmpBytes[0] = byteArray[len-1];
tmpBytes[1] = 0;
tmpBytes[2] = 0;
}
if (lastGroupLen == 2)
{
tmpBytes[0] = byteArray[len - 2];
tmpBytes[1] = byteArray[len - 1];
tmpBytes[2] = 0;
}

s.Append(Convert.ToString((int)tmpBytes[0], 2).PadLeft(8, '0'));
s.Append(Convert.ToString((int)tmpBytes[1], 2).PadLeft(8, '0'));
s.Append(Convert.ToString((int)tmpBytes[2], 2).PadLeft(8, '0'));

var data = s.ToString();
s.Clear();

//转换成4个6位,然后转换成整数 //011001 000000 000000 000000 16 + 8 +1 =25
var p1 = data.Substring(0, 6);
var p2 = data.Substring(6, 6);
var p3 = data.Substring(12, 6);
var p4 = data.Substring(18, 6);

if (lastGroupLen==1)
{
//编码一组3个字节为4字节
base64Str = alph[Convert.ToInt32(p1, 2)].ToString() +
alph[Convert.ToInt32(p2, 2)].ToString() + "==";
}
if (lastGroupLen == 2)
{
//编码一组3个字节为4字节
base64Str = alph[Convert.ToInt32(p1, 2)].ToString() +
alph[Convert.ToInt32(p2, 2)].ToString() +
alph[Convert.ToInt32(p3, 2)].ToString() + "=";
}


t.Append(base64Str);


}
Console.WriteLine("StingToBinary: source: {0} -> target: {1}",toEncodeString,t.ToString());
return t.ToString();
}

BASE64算法原理解析之C#实现_4s_02