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

这篇具有很好参考价值的文章主要介绍了BASE64算法原理解析之C#实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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,就加多少个=

编码示例

c# base64,C#,c#

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

c# base64,C#,c#

 文章来源地址https://www.toymoban.com/news/detail-613980.html

到了这里,关于BASE64算法原理解析之C#实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c# .net linux ImageSharp+FastDFS+Base64上传图片,压缩图片大小,图像处理dcoker中使用也可以

    .net 以前是用System.Drawing来处理图片,但是在dcoker 、linux上用不了 微软官方推荐用 1、SkiaSharp 如果项目运行到docker里,需要NUGET安装SkiaSharp.NativeAssets.Linux.NoDependencies 注意:如果你同时引用SkiaSharp.NativeAssets.Linux和SkiaSharp.NativeAssets.Linux.NoDependencies 可能会导致docker中运行报错,

    2024年02月07日
    浏览(36)
  • 安卓base64与其他语言base64算法还原出来差异问题???

    今天逆向某app时,发现了最后一步base64编码后后几位不一致。 之前有遇到空格及换行等问题,eg : 在在线工具生成对比后,确实后几位有出入。 回看了代码base64就是调用的标准算法,且也没更换码表。 众所周知,base64是以6位进行便宜,而正常是8个bit位,这样就会缺两位进行

    2024年02月12日
    浏览(50)
  • base4解密(Base64加密算法)

    base64解密解码转换说明: 1、Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。如果剩下的字符不足3个字节,则用0填充,输出字符使用‘=’,因此编码后输出的文本末尾可能会出现1或2个‘=’。 2、为了保

    2024年02月16日
    浏览(96)
  • 算法~base64算法理解

    Base64 是一种用于将二进制数据编码成 ASCII 字符的编码方式。它主要用于在文字环境中传输或存储二进制数据,如在电子邮件、XML 文件、URL 参数等。Base64 编码不是一种加密算法,而是一种编码方式,其主要作用是将二进制数据转换为文本数据,以便更容易在文本协议中处理

    2024年02月05日
    浏览(35)
  • 【C语言】C语言编程实战:Base64编解码算法从理论到实现(附完整代码)

    🧑 作者简介 :阿里巴巴嵌入式技术专家,深耕嵌入式+人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍 :分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导、简历面试辅导、技术架构设计优化、开发外包等服

    2024年03月13日
    浏览(32)
  • c# 继承 new,base的使用

    在C#中,继承是指一个类(称为派生类或子类)从另一个类(称为基类或父类)继承属性和方法的机制。继承可以帮助我们重用代码并构建层次化的类结构。要使用继承,在定义类时使用冒号(:)指定其基类。下面是一个简单的C#继承示例: 在上面的示例中,类Animal是基类,

    2024年01月24日
    浏览(30)
  • c#继承(new base)的使用

    C#中的继承是面向对象编程的重要概念之一,它允许一个类(称为子类或派生类)从另一个类(称为父类或基类)继承属性和行为。 继承的主要目的是实现代码重用和层次化的组织。子类可以继承父类的字段、属性、方法和事件,而无需重新实现这些成员。通过继承,我们可

    2024年02月09日
    浏览(27)
  • C/C++学习 -- Base64算法

    Base64算法概述 Base64是一种用于将二进制数据表示为ASCII字符集中的可打印字符的编码方法。它由64个不同的字符组成,通常包括26个大写字母、26个小写字母、10个数字以及两个特殊字符(通常是\\\"+\\\"和\\\"/\\\")。Base64编码的目的是使数据变得不可读,而不是加密数据。它经常用于电

    2024年02月01日
    浏览(38)
  • 20.1 OpenSSL 字符BASE64压缩算法

    OpenSSL 是一种开源的加密库,提供了一组用于加密和解密数据、验证数字证书以及实现各种安全协议的函数和工具。它可以用于创建和管理公钥和私钥、数字证书和其他安全凭据,还支持 SSL/TLS 、 SSH 、 S/MIME 、 PKCS 等常见的加密协议和标准。 OpenSSL 的功能非常强大,可以用于

    2024年02月08日
    浏览(29)
  • base64图片是什么?原理是什么?优缺点是什么?

    Base64图片是一种将图像数据编码为文本字符串的方法,通常用于将图像嵌入到网页或其他文档中,以减少HTTP请求或实现某些特定的需求。Base64编码的原理是将3个8位的字节转化为4个6位的字节,然后在6位的前面补两个0,形成8位一个字节的形式。如果剩下的字符不足3个字节,

    2024年01月20日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包