zoukankan      html  css  js  c++  java
  • Base64 编码原理

    1.编码表

    2.原理[汉字不能base64编码]

     base64 编码就是将字符以3个为一组,因为一个字符由8个位组成,3*8=24位,然后以顺序以6个位拿出,前面补2位,凑成8位--一个字节

    原字节不能被3整除的,在后面补 由8个0,构成的单字节,一般补1个或是2个(0000 0000),这些后面补的字节不能用base64编码对应,应该是异常字符,用“=”号替换,

    所以,base64编码一般最后会有1~2个“=”号

    示例:

    base64编码前:Lucy
                L           u           c           y
    ASCII: 76 117 99 121
    8bit字节: 01001100 01110101 01100011 01111001 00000000 00000000
    6bit字节: 010011 000111 010101 100011 011110 010000 000000 000000
    十进制: 19 7 21 35 30 16 (异常) (异常)
    对应编码: T H V j e Q = =

    base64编码后的结果:THVjeQ==

    3.转换过程

     1  1.//得到ascii码
     2                 ascii = Convert.ToInt32(str).ToString();
     3                 2.//得到二进制数据
     4                 binary = Convert.ToString(Convert.ToByte(ascii),2).PadLeft(8,'0');
     5                 3.//截取6字节 前面补0
     6                  bit6 = binary.Substring(0, 6);
     7 
     8                  4.//转换为十进制
     9 
    10                  position = Convert.ToInt32(bit6,2);
    11 
    12                  5.//获取对应的base64码
    13 
    14                  c = base64hash.ToArray()[position];
    基本转换过程

    4.控制台实现

     1 static void Main(string[] args)
     2         {
     3             string base64hash = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
     4             string input = Console.ReadLine();
     5             string ascii = "";
     6             string binary = "";
     7             int i = 0;
     8             string previous="";
     9             int mod=0;
    10             string bit6="";
    11             int position;
    12             char c;
    13             StringBuilder sb = new StringBuilder();
    14  
    15             while (i<input.ToArray().Length)
    16             {
    17                 char str = input[i];
    18                 //得到ascii码
    19                 ascii = Convert.ToInt32(str).ToString();
    20                 //得到二进制
    21                 binary = Convert.ToString(Convert.ToByte(ascii),2).PadLeft(8,'0');
    22  
    23                 //以3个字符为一组
    24                 mod = i % 3;
    25                 switch (mod)
    26                 {
    27                     //组中的第一个字符
    28                     case 0:
    29                         //截取6字节 前面补0
    30                         bit6 = binary.Substring(0, 6);
    31                         //转换为十进制
    32                         position = Convert.ToInt32(bit6,2);
    33                         //获取对应的base64码
    34                         c = base64hash.ToArray()[position];
    35                         sb.Append(c);
    36                         break;
    37                     //组中的第二个字符
    38                     case 1:
    39                         //取前一个字符的后2位+ 当前字符的前4位(二进制格式)
    40                         bit6 = (previous.Substring(6, 2) + binary.Substring(0,4));
    41                         //转换为十进制
    42                         position = Convert.ToInt32(bit6, 2);
    43                         //获取对应的base64码
    44                         c = base64hash.ToArray()[position];
    45                         sb.Append(c);
    46                         break;
    47                     //组中的第三个字符
    48                     case 2:
    49                         //取前一个字符的后4位+ 当前字符的前2位(二进制格式)
    50                         bit6 = (previous.Substring(4, 4) + binary.Substring(0, 2));
    51                         //转换为十进制
    52                         position = Convert.ToInt32(bit6, 2);
    53                         //获取对应的base64码
    54                         c = base64hash.ToArray()[position];
    55                         sb.Append(c);
    56  
    57                         //剩余六位
    58                         bit6 = (binary.Substring(2, 6));
    59                         //转换为十进制
    60                         position = Convert.ToInt32(bit6, 2);
    61                         //获取对应的base64码
    62                         c = base64hash.ToArray()[position];
    63                         sb.Append(c);
    64                         break;
    65                 }
    66                 previous = binary;
    67                 i++;
    68             }
    69  
    70             if (mod == 0)//需要补两个字符(0000 0000   0000 0000)
    71             {
    72                 //将剩下的后2位+补的前4位
    73                 bit6 = (previous.Substring(6, 2) + "0000");
    74                 //转换为十进制
    75                 position = Convert.ToInt32(bit6, 2);
    76                 //获取对应的base64码
    77                 c = base64hash.ToArray()[position];
    78                 sb.Append(c);
    79                 //添加两个==(异常)
    80                 sb.Append("==");
    81             }
    82             else if (mod == 1)//需要补一个字符(0000 0000)
    83             {
    84                 //将剩下的后4位+补的前2位
    85                 bit6 = (previous.Substring(4, 4) + "00");
    86                 //转换为十进制
    87                 position = Convert.ToInt32(bit6, 2);
    88                 //获取对应的base64码
    89                 c = base64hash.ToArray()[position];
    90                 sb.Append(c);
    91                 //添加一个=(异常)
    92                 sb.Append("=");
    93             }
    94             Console.WriteLine(sb.ToString());
    95  
    96             Console.ReadKey();
    97         }
    控制台实现
  • 相关阅读:
    vmware fusion和mac共享目录
    安卓linker源码阅读01
    sublime text 快捷键
    eclipse使用经验汇总
    递归池:
    ubuntu下adb红米
    蛋疼问题汇总you must restart adb and eclipse
    JNI
    ARM寻址
    了解装饰器
  • 原文地址:https://www.cnblogs.com/JsonYang/p/3785198.html
Copyright © 2011-2022 走看看