知行合一

享受过程 漠视结果

导航

Base64

        private string Encode(string str)
        {
            byte[] buffer = Encoding.Default.GetBytes(str);

            byte b1, b2, b3, c1, c2, c3, c4;
            string mes = string.Empty;
            int count = buffer.Length / 3;
            int resst = buffer.Length % 3;

            for (int i = 0; i < count; i++)
            {
                int j = i * 3;
                b1 = buffer[j];
                b2 = buffer[j + 1];
                b3 = buffer[j + 2];

                c1 = (byte)(b1 >> 2);
                c2 = (byte)(((b1 & 3) << 4) + (b2 >> 4));
                c3 = (byte)(((b2 & 15) << 2) + (b3 >> 6));
                c4 = (byte)(b3 & 63);
                mes += GetChar(c1, c2, c3, c4);
            }

            if (resst == 1)
            {
                b1 = buffer[buffer.Length - 1];
                c1 = (byte)(b1 >> 2);
                c2 = (byte)((b1 & 3) << 4);
                c3 = 64;
                c4 = 64;
                mes += GetChar(c1, c2, c3, c4);
            }
            else if (resst == 2)
            {
                b1 = buffer[buffer.Length - 2];
                b2 = buffer[buffer.Length - 1];
                c1 = (byte)(b1 >> 2);
                c2 = (byte)(((b1 & 3) << 4) + (b2 >> 4));
                c3 = (byte)((b2 & 15) << 2);
                c4 = 64;
                mes += GetChar(c1, c2, c3, c4);
            }

            return mes;
        }

        private string Decode(string str)
        {
            byte[] buffer = Encoding.Default.GetBytes(str);

            byte b1, b2, b3, c1, c2, c3, c4;
            string mes = string.Empty;
            int count = buffer.Length / 4;
            int resst = buffer.Length % 4;

            for (int i = 0; i < count; i++)
            {
                int j = i * 4;
                c1 = GetIndex(buffer[j]);
                c2 = GetIndex(buffer[j + 1]);
                c3 = GetIndex(buffer[j + 2]);
                c4 = GetIndex(buffer[j + 3]);

                b1 = (byte)((c1 << 2) + (c2 >> 4));
                if (c3 != 64 && c4 != 64)
                {
                    b2 = (byte)(((c2 & 15) << 4) + (c3 >> 2));
                    b3 = (byte)(((c3 & 3) << 6) + c4);
                    mes += Convert.ToChar(b1);
                    mes += Convert.ToChar(b2);
                    mes += Convert.ToChar(b3);
                }
                else if (c3 != 64 && c4 == 64)
                {
                    b2 = (byte)(((c2 & 15) << 4) + (c3 >> 2));
                    mes += Convert.ToChar(b1);
                    mes += Convert.ToChar(b2);
                }
                else
                    mes += Convert.ToChar(b1);
            }

            return mes;
        }

        private string GetChar(byte c1, byte c2, byte c3, byte c4)
        {
            return new string(new char[] { cs[c1], cs[c2], cs[c3], cs[c4] });
        }

        private byte GetIndex(byte c)
        {
            for (byte i = 0; i < cs.Length; i++)
            {
                if (c == cs[i])
                    return i;
            }
            return 0;
        }

 

        private char[] cs = new char[]
            {
            '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',
            '+','/','='};

 

posted on 2013-01-30 11:02  项羽  阅读(273)  评论(0编辑  收藏  举报