用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 }
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); } }
标签:
C#学习笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~