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 "";
}
}
}