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

本文详细介绍了BASE64编码的基本原理及其实现过程。通过具体的编码示例,文章展示了如何将原始数据转换为BASE64格式,并针对不同情况讨论了如何处理不足3字节的数据。此外,还提供了一段完整的C#代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自由软件开发者

有你的鼓励,我会更加努力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值