Base64类

 

using System;
using System.Collections.Generic;
using System.Text;

namespace VPOS318_WCE_600
{
    public class Base64
    {
        /// <summary>
        /// Base64密码表
        /// </summary>
        private const string CodeTable = "ABEFGHefgI6JL5MNX3K4YZabcdhiQRS89+TUVjklmnvwxyopqCDrstuz01OPW27^";
        /// <summary>
        /// 补位符号
        /// </summary>
        private const char CodeChar = '$';
        /// <summary>
        /// Base64加密函数
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public static string Base64EnCdoe(string code)
        {
            List<byte> bytes = new List<byte>(Encoding.Default.GetBytes(code));
            int bytes_len = bytes.Count;
            int Int_Length = bytes_len / 3 + (bytes_len % 3 != 0 ? 1 : 0);
            bytes.Add(0);
            bytes.Add(0);
            StringBuilder values = new StringBuilder();
            for (int i = 0; i < Int_Length; i++)
            {
                values.Append(CodeTable[(byte)(bytes[i * 3] & 0x3F)]);
                values.Append(CodeTable[(byte)((bytes[i * 3 + 1] & 0x0F) << 2 | (bytes[i * 3] >> 6 & 0x03))]);
                values.Append(CodeTable[(byte)(bytes[i * 3 + 2] << 4 & 0x30 | bytes[i * 3 + 1] >> 4 & 0x0F)]);
                values.Append(CodeTable[(byte)(bytes[i * 3 + 2] >> 2 & 0x3F)]);
            }
            return bytes_len % 3 == 1 ? values.ToString().Substring(0, values.Length - 2) + CodeChar + CodeChar : bytes_len % 3 == 2 ? values.ToString().Substring(0, values.Length - 1) + CodeChar : values.ToString();
        }

        /// <summary>
        /// Base64解密函数
        /// </summary>
        /// <param name="Code"></param>
        /// <returns></returns>
        public static string Base64DnCdoe(string Code)
        {
            List<byte> bytes = new List<byte>();    // 待解码的数组
            int Temp = 0, j = 0;
            for (int i = 0; i < Code.Length; i++)
            {// 把密码根据密码表翻译回6位有效位的Byte数组
                Temp = CodeTable.IndexOf(Code[i]);
                if (Temp >= 0) bytes.Add((byte)Temp); else bytes.Add(0);
            }
            byte[] tmps = new byte[(bytes.Count / 4) * 3]; // 创建明文 Byte 数组
            if (bytes.Count % 4 == 0)
            {
                for (int i = 0; i < bytes.Count; )
                {// 把四个Byte元素的值,去除高二位,然后存入临时 Int 变量以便于每次8位的取出
                    Temp = bytes[i++] | bytes[i++] << 6 | bytes[i++] << 12 | bytes[i++] << 18;
                    tmps[j++] = (byte)Temp;            // 取低八位
                    tmps[j++] = (byte)(Temp >> 8);    // 取中八位
                    tmps[j++] = (byte)(Temp >> 16); // 取高八位
                }
                // 如果找到CodeChar字符(也就是补位符号,一般是‘=’)是在倒数第二,则,丢弃最后两字符,如果是在倒数第一,则丢弃最后一个字符,如果没有找到,则完整返回
                return Encoding.Default.GetString(tmps, 0, (Code.IndexOf(CodeChar) == Code.Length - 2 ? tmps.Length - 2 : Code.IndexOf(CodeChar) == Code.Length - 1 ? tmps.Length - 1 : tmps.Length));
            }
            else // 不是4的倍数,该加密字符串有不合法
                return "";
        }

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值