用C#简单实现的36进制转换代码

 

2023-06-07改进版

/// <summary>
    /// 根据字符定义新的用字符串表示的进制数
    /// </summary>
    public class Scale {

        #region 静态成员
        /// <summary>
        /// 使用懒加载实现单例以及延迟创建
        /// </summary>
        static readonly Lazy<Scale> scale34 = new Lazy<Scale>(() => new Scale());
        static readonly Lazy<Scale> scale62 = new Lazy<Scale>(() => new Scale("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"));
        /// <summary>
        /// 默认的34进制,字符集0123456789ABCDEFGHJKLMNPQRSTUVWXYZ,排除容易和0和1混淆的字母I和O
        /// </summary>
        public static Scale Scale34 { get { return scale34.Value; } }
        /// <summary>
        /// 62进制,字符集0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,10个数字+26个小写字母+26个大写字母
        /// </summary>
        public static Scale Scale62 { get { return scale62.Value; } }
        /// <summary>
        /// 创建一个新的进制
        /// </summary>
        public static Scale Create(string chars) {
            return new Scale(chars);
        }
        #endregion

        #region 对象成员
        readonly char[] charArray;
        readonly Dictionary<char, int> charDict;
        /// <summary>
        /// 字符集长度,也是进制数
        /// </summary>
        public uint Length { get; private set; }
        /// <summary>
        /// 创建一个进制类,能够使用指定的字符标识int64
        /// </summary> 
        Scale(string chars = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ") {
            charArray = chars.ToCharArray();
            charDict = new Dictionary<char, int>();
            for (int i = 0; i < charArray.Length; i++) {
                charDict.Add(charArray[i], i);
            }
            Length = (uint)charArray.Length;
        }
        /// <summary>
        /// 将UInt64转成当前进制字符串
        /// </summary>
        public string ToCode(ulong num) {
            Stack<char> codes = new Stack<char>();
            while (num >= Length) {
                codes.Push(charArray[num % Length]);
                num /= Length;
            }
            codes.Push(charArray[num]);
            return new string(codes.ToArray());
        }
        /// <summary>
        /// 将当前进制字符串转成UInt64
        /// </summary>
        public ulong ToUInt64(string code) {
            double num = 0;
            for (int i = 0; i < code.Length; i++) {
                num += charDict[code[i]] * Math.Pow(Length, code.Length - 1 - i);
            }
            return Convert.ToUInt64(num);
        }
        /// <summary>
        /// 进制加法
        /// </summary>
        public string Add(string code, uint num = 1) {
            return ToCode(ToUInt64(code) + num);
        }
        #endregion
    }
View Code

 2019-8-30版本

class Program {
        static void Main(string[] args) {
            string curr = "ZZZZZZ";
            Console.WriteLine("原始值:" + curr);
            Int64 num = Scale.ToInt64(curr);
            Console.WriteLine("转成Int64:" + num);
            Console.WriteLine("根据Int64转成进制:" + Scale.ToCurr(num));
            Console.ReadLine();
        }
    }
    public static class Scale {
        /// <summary>
        /// 进制符号字符串
        /// </summary>
        private static string scString = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ";
        /// <summary>
        /// 字符集,可以根据编号索引拿到字符
        /// </summary>
        private static char[] scArray = scString.ToCharArray();
        /// <summary>
        /// 字符字典,可以根据字符拿到编号索引
        /// </summary>
        private static Dictionary<char, int> scDic = ToCharDic();
        /// <summary>
        /// 根据字符串反馈进制数
        /// </summary>
        public static int Len { get { return scString.Length; } }
 
        /// <summary>
        /// 将字符串处理成字符字典
        /// </summary>
        private static Dictionary<char, int> ToCharDic() {
            Dictionary<char, int> dic = new Dictionary<char, int>();
            for (int i = 0; i < scArray.Length; i++) {
                dic.Add(scArray[i], i);
            }
            return dic;
        }
        /// <summary>
        /// 根据传入的字符符号定义进制,字符符号不能重复,模拟十进制字符串为:0123456789
        /// </summary>
        public static void SetScale(string scaleString) {
            scString = scaleString;
            scArray = scString.ToCharArray();
            scDic = ToCharDic();
        }
        /// <summary>
        /// 将Int64转成当前进制字符串
        /// </summary>
        public static string ToCurr(long num) {
            string curr = "";
            while (num >= Len) {
                curr = scArray[num % Len] + curr;
                num = num / Len;
            }
            curr = scArray[num] + curr;
            return curr;
        }
        /// <summary>
        /// 将当前进制字符串转成Int64
        /// </summary>
        public static long ToInt64(string curr) {
            double num = 0;
            for (int i = 0; i < curr.Length; i++) {
                num += scDic[curr[i]] * Math.Pow(Len, curr.Length - 1 - i);
            }
            return Convert.ToInt64(num);
        }
    }
View Code

 

posted @ 2015-03-25 18:45  WmW  阅读(1928)  评论(1编辑  收藏  举报