Base64编码表

来源:互联网 发布:周易六爻算法 编辑:程序博客网 时间:2024/04/29 03:11

标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它在末尾填充’=’号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“*”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。
此外还有一些变种,它们将“+/”改为“-”或“.”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
规则

关于这个编码的规则:

①.把3个字符变成4个字符。
②每76个字符加一个换行符。
③.最后的结束符也要处理。
例子(1)
转换前 11111111, 11111111, 11111111 (二进制)
转换后 00111111, 00111111, 00111111, 00111111 (二进制)
上面的三个字节是原文,下面的四个字节是转换后的Base64编码,其前两位均为0。
转换后,我们用一个码表来得到我们想要的字符串(也就是最终的Base64编码),这个表是这样的:(摘自RFC2045)

转换表

索引 对应字符 索引 对应字符 索引 对应字符 索引 对应字符 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 + 12 M 29 d 46 u 63 / 13 N 30 e 47 v 14 O 31 f 48 w 15 P 32 g 49 x 16 Q 33 h 50 y
//自己完成算法实现        /// <summary>        ///     Base64加密        /// </summary>        /// <param name="Message"></param>        /// <returns></returns>        public string Base64Code(string Message)        {            char[] Base64Code =            {                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',                'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',                'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',                '8', '9', '+', '/', '='            };            byte empty = 0;            var byteMessage = new ArrayList(Encoding.Default.GetBytes(Message));            StringBuilder outmessage;            int messageLen = byteMessage.Count;            //将字符分成3个字节一组,如果不足,则以0补齐            int page = messageLen/3;            int use = 0;            if ((use = messageLen%3) > 0)            {                for (int i = 0; i < 3 - use; i++)                    byteMessage.Add(empty);                page++;            }            //将3个字节的每组字符转换成4个字节一组的。3个一组,一组一组变成4个字节一组            //方法是:转换成ASCII码,按顺序排列24位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。            outmessage = new StringBuilder(page*4);            for (int i = 0; i < page; i++)            {                //取一组3个字节的组                var instr = new byte[3];                instr[0] = (byte) byteMessage[i*3];                instr[1] = (byte) byteMessage[i*3 + 1];                instr[2] = (byte) byteMessage[i*3 + 2];                //六个位为一组,补0变成4个字节                var outstr = new int[4];                //第一个输出字节:取第一输入字节的前6位,并且在高位补0,使其变成8位(一个字节)                outstr[0] = instr[0] >> 2;                //第二个输出字节:取第一输入字节的后2位和第二个输入字节的前4位(共6位),并且在高位补0,使其变成8位(一个字节)                outstr[1] = ((instr[0] & 0x03) << 4) ^ (instr[1] >> 4);                //第三个输出字节:取第二输入字节的后4位和第三个输入字节的前2位(共6位),并且在高位补0,使其变成8位(一个字节)                if (!instr[1].Equals(empty))                    outstr[2] = ((instr[1] & 0x0f) << 2) ^ (instr[2] >> 6);                else                    outstr[2] = 64;                //第四个输出字节:取第三输入字节的后6位,并且在高位补0,使其变成8位(一个字节)                if (!instr[2].Equals(empty))                    outstr[3] = (instr[2] & 0x3f);                else                    outstr[3] = 64;                outmessage.Append(Base64Code[outstr[0]]);                outmessage.Append(Base64Code[outstr[1]]);                outmessage.Append(Base64Code[outstr[2]]);                outmessage.Append(Base64Code[outstr[3]]);            }            return outmessage.ToString();        }        /// <summary>        ///     Base64解密        /// </summary>        /// <param name="Message"></param>        /// <returns></returns>        public string Base64Decode(string Message)        {            if ((Message.Length%4) != 0)            {                throw new ArgumentException("不是正确的BASE64编码,请检查。", "Message");            }            if (!Regex.IsMatch(Message, "^[A-Z0-9/+=]*$", RegexOptions.IgnoreCase))            {                throw new ArgumentException("包含不正确的BASE64编码,请检查。", "Message");            }            string Base64Code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";            int page = Message.Length/4;            var outMessage = new ArrayList(page*3);            char[] message = Message.ToCharArray();            for (int i = 0; i < page; i++)            {                var instr = new byte[4];                instr[0] = (byte) Base64Code.IndexOf(message[i*4]);                instr[1] = (byte) Base64Code.IndexOf(message[i*4 + 1]);                instr[2] = (byte) Base64Code.IndexOf(message[i*4 + 2]);                instr[3] = (byte) Base64Code.IndexOf(message[i*4 + 3]);                var outstr = new byte[3];                outstr[0] = (byte) ((instr[0] << 2) ^ ((instr[1] & 0x30) >> 4));                if (instr[2] != 64)                {                    outstr[1] = (byte) ((instr[1] << 4) ^ ((instr[2] & 0x3c) >> 2));                }                else                {                    outstr[2] = 0;                }                if (instr[3] != 64)                {                    outstr[2] = (byte) ((instr[2] << 6) ^ instr[3]);                }                else                {                    outstr[2] = 0;                }                outMessage.Add(outstr[0]);                if (outstr[1] != 0)                    outMessage.Add(outstr[1]);                if (outstr[2] != 0)                    outMessage.Add(outstr[2]);            }            var outbyte = (byte[]) outMessage.ToArray(Type.GetType("System.Byte"));            return Encoding.Default.GetString(outbyte);        }

 //直接使用.NET中的的库类函数        ///<summary>        ///Base64加密        ///</summary>        ///<param name="Message"></param>        ///<returns></returns>        public string Base64Code(string Message)        {            byte[] bytes = Encoding.Default.GetBytes(Message);            return Convert.ToBase64String(bytes);        }        ///<summary>        ///Base64解密        ///</summary>        ///<param name="Message"></param>        ///<returns></returns>        public string Base64Decode(string Message)        {            byte[] bytes = Convert.FromBase64String(Message);            return Encoding.Default.GetString(bytes);        }
0 0
原创粉丝点击