我的Base64编码,去掉等号特殊字符分析

访客 阅读:200 2020-06-30 16:19:24 评论:0
  1     /// <summary>自定义包含指定字符的base64工具</summary> 
  2     internal static class Base64Helper 
  3     { 
  4         static readonly string base64Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-"; 
  5         static readonly int[] base64Index = new int[] 
  6         { 
  7             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 
  8             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 
  9             -1,63,-1,-1,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1, 
 10             2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1, 
 11             -1,-1,-1,62,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42, 
 12             43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1,-1 
 13         }; 
 14         public static byte[] FromBase64String(string inData) 
 15         { 
 16             int inDataLength = inData.Length; 
 17             int lengthmod4 = inDataLength % 4; 
 18             int calcLength = (inDataLength - lengthmod4); 
 19             byte[] outData = new byte[inDataLength / 4 * 3 + 3]; 
 20             int j = 0; 
 21             int i; 
 22             int num1, num2, num3, num4; 
 23  
 24             for (i = 0; i < calcLength; i += 4, j += 3) 
 25             { 
 26                 num1 = base64Index[inData[i]]; 
 27                 num2 = base64Index[inData[i + 1]]; 
 28                 num3 = base64Index[inData[i + 2]]; 
 29                 num4 = base64Index[inData[i + 3]]; 
 30  
 31                 outData[j] = (byte)((num1 << 2) | (num2 >> 4)); 
 32                 outData[j + 1] = (byte)(((num2 << 4) & 0xf0) | (num3 >> 2)); 
 33                 outData[j + 2] = (byte)(((num3 << 6) & 0xc0) | (num4 & 0x3f)); 
 34             } 
 35             i = calcLength; 
 36             switch (lengthmod4) 
 37             { 
 38                 case 3: 
 39                     num1 = base64Index[inData[i]]; 
 40                     num2 = base64Index[inData[i + 1]]; 
 41                     num3 = base64Index[inData[i + 2]]; 
 42  
 43                     outData[j] = (byte)((num1 << 2) | (num2 >> 4)); 
 44                     outData[j + 1] = (byte)(((num2 << 4) & 0xf0) | (num3 >> 2)); 
 45                     j += 2; 
 46                     break; 
 47                 case 2: 
 48                     num1 = base64Index[inData[i]]; 
 49                     num2 = base64Index[inData[i + 1]]; 
 50  
 51                     outData[j] = (byte)((num1 << 2) | (num2 >> 4)); 
 52                     j += 1; 
 53                     break; 
 54             } 
 55             Array.Resize(ref outData, j); 
 56             return outData; 
 57         } 
 58         public static string ToBase64String(byte[] inData) 
 59         { 
 60             int inDataLength = inData.Length; 
 61             int outDataLength = (int)(inDataLength / 3 * 4) + 4; 
 62             char[] outData = new char[outDataLength]; 
 63  
 64             int lengthmod3 = inDataLength % 3; 
 65             int calcLength = (inDataLength - lengthmod3); 
 66             int j = 0; 
 67             int i; 
 68  
 69             for (i = 0; i < calcLength; i += 3, j += 4) 
 70             { 
 71                 outData[j] = base64Table[inData[i] >> 2]; 
 72                 outData[j + 1] = base64Table[((inData[i] & 0x03) << 4) | (inData[i + 1] >> 4)]; 
 73                 outData[j + 2] = base64Table[((inData[i + 1] & 0x0f) << 2) | (inData[i + 2] >> 6)]; 
 74                 outData[j + 3] = base64Table[(inData[i + 2] & 0x3f)]; 
 75             } 
 76  
 77             i = calcLength; 
 78             switch (lengthmod3) 
 79             { 
 80                 case 2: 
 81                     outData[j] = base64Table[inData[i] >> 2]; 
 82                     outData[j + 1] = base64Table[((inData[i] & 0x03) << 4) | (inData[i + 1] >> 4)]; 
 83                     outData[j + 2] = base64Table[(inData[i + 1] & 0x0f) << 2]; 
 84                     j += 3; 
 85                     break; 
 86                 case 1: 
 87                     outData[j] = base64Table[inData[i] >> 2]; 
 88                     outData[j + 1] = base64Table[(inData[i] & 0x03) << 4]; 
 89                     j += 2; 
 90                     break; 
 91             } 
 92             return new string(outData, 0, j); 
 93         } 
 94         public static string Base64Encode(string source) 
 95         { 
 96             byte[] barray = Encoding.Default.GetBytes(source); 
 97             return Base64Helper.ToBase64String(barray); 
 98         } 
 99         public static string Base64Decode(string source) 
100         { 
101             byte[] barray = Base64Helper.FromBase64String(source); 
102             return Encoding.Default.GetString(barray); 
103         } 
104     }

 

标签:加密算法
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
关注我们

扫一扫关注我们,了解最新精彩内容