1. BASE64算法原理:
base64编码规则
A.采用64个基本的ASCII码字符对数据进行重新编码
B.将要编码字符串拆分成字节数组,以3个字节为一组。按顺序排列24 位数据,
C.把24位数据分成4组,每组6位,每组最高位前补两个0凑足一个字节,
3字节为一组的数据重新编码成4个字节数据
D.若编码的数据的字节数不能被3整除,即最后一组不足3字节,
为最后一组填充1到2个0字节,编码完成后在结尾添加1到2个 “=”,
补多少个0,就加多少个=
编码示例
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();
}
文章来源:https://www.toymoban.com/news/detail-613980.html
文章来源地址https://www.toymoban.com/news/detail-613980.html
到了这里,关于BASE64算法原理解析之C#实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!