目录
- 1. 引言:进制转换的重要性
- 2. 进制转换工具类完整实现
- 3. 算法原理详解
- 3.1 字符串转数值算法(ToUInt64)
- 3.2 数值转字符串算法(ToString)
- 4. 关键位置
- 4.1 字符映射机制
- 4.2 错误处理与边界条件
- 5. 使用示例与场景
- 5.1 基础转换示例
- 5.2 实际应用场景
- 6. 总结
1. 引言:进制转换的重要性
进制转换是计算机科学中的基础技能,在编程开发、网络通信、数据加密等领域有着广泛应用。虽然C#提供了Convert
类等内置转换方法,但自定义进制转换工具类能提供更大的灵活性,特别是支持2~36进制的任意转换。本文将深入解析一个完整的进制转换工具类,逐行分析代码实现,并通过流程图直观展示算法原理。
进制转换的本质是将数字从一种表示系统转换为另一种表示系统。例如二进制使用0和1两个数字,十六进制使用0-9和A-F共16个字符。而36进制则使用0-9和A-Z所有字符,能够更紧凑地表示大数字。
2. 进制转换工具类完整实现
以下是一个完整的C#进制转换工具类,支持2~36进制之间的相互转换:
ushttp://www.devze.coming System; /// <summary> /// 进制转换工具类,支持2~36进制之间的转换 /// </summary> public static class RadixConverter { // 字符集定义:0-9和A-Z分别表示0~35 [DebuggerBrowsable(DebuggerBrowsableState.Never)] private static readonly string _keys = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /// <summary> /// 将字符串转换为double类型 /// </summary> /// <param name="v">要转换的字符串</param> /// <param name="radix">进制基数(2-36)</param> /// <returns>转换后的double值</returns> public static double ToDouble(string v, int radix) => BitConverter.Int64BitsToDouble(ToInt64(v, radix)); /// <summary> /// 将字符串转换为long类型 /// </summary> public static long ToInt64(string v, int radix) => (long)ToUInt64(v, radix); /// <summary> /// 核心方法:将字符串转换为ulong(支持2~36进制) /// </summary> public static ulong ToUInt64(string v, int radix) { // 处理空字符串或null值 if (string.IsNullOrEmpty(v)) { return 0; } // 进制参数验证与修正 if (radix < 2) { radix = 10; // 默认使用十进制 } else if (radix > _keys.Length) { radix = _keys.Length; // 最大不能超过字符集长度 } ulong result = 0; // 存储转换结果 ulong baseValue = (ulong)radix; // 进制基数 ulong weight = 0; // 当前位的权重(基数的幂次) // 从字符串末尾向前遍历(从低位到高位) for (int i = v.Length - 1; i > -1; i--) { char ch = v[i]; ulong digitVa编程lue; // 字符到数字的映射转换 if (ch >= '0' &&www.devze.com; ch <= '9') { digitValue = (ulong)(ch - '0'); // 数字0-9直接转换 } else if (ch >= 'A' && ch <= 'Z') { digitValue = 10 + (ulong)(ch - 'A'); // 大写字母A-Z对应10-35 } else if (ch >= 'a' && ch <= 'z') { digitValue = 10 + (ulong)(ch - 'a'); // 小写字母a-z对应10-35 } else { return 0; // 非法字符返回0 } // 检查数字是否有效(不能大于等于基数) 编程客栈 if (digitValue >= baseValue) { return 0; } // 计算当前位的贡献值 if (i == v.Length - 1) // 最低位(权重为1) { result += digitValue; weight = baseValue; // 初始化权重 } else // 高位:权重递增 { result += digitValue * weight; weight = weight * baseValue; // 权重乘以基数 } } return result; } // 以下为数值转字符串的重载方法 public static string ToString(long v, int radix) => ToString(v, radix, 0); public static string ToString(ulong v, int radix) => ToString(phpv, radix, 0); public static string ToString(double v, int radix) => ToString(v, radix, 0); public static string ToString(long v, int radix, int padding) => ToString(v, radix, padding, '0'); public static string ToString(ulong v, int radix, int padding) => ToString(v, radix, padding, '0'); public static string ToString(double v, int radix, int padding) => ToString(v, radix, padding, '0'); /// <summary> /// 将double转换为字符串 /// </summary> public static string ToString(double v, int radix, int padding, char paddingChar) => ToString(BitConverter.DoubleToInt64Bits(v), radix, padding, paddingChar); /// <summary> /// 将long转换为字符串 /// </summary> public static string ToString(long v, int radix, int padding, char paddingChar) => ToString((ulong)v, radix, padding, paddingChar); /// <summary> /// 核心方法:将ulong数值转换为指定进制的字符串 /// </summary> public static string ToString(ulong v, int radix, int padding, char paddingChar) { // 进制参数验证 if (radix < 2) { radix = 10; } else if (radix > _keys.Length) { radix = _keys.Length; } uint baseValue = (uint)radix; string result; // 处理零值特殊情况 if (v == 0) { result = "0"; } else { result = string.Empty; // 使用除基取余法进行转换 while (v > 0) { ulong remainder = v % baseValue; // 计算当前余数 result = _keys[(int)remainder] + result; // 将余数映射为字符并拼接到结果前 v /= baseValue; // 更新商值 } } // 填充处理:确保结果达到指定长度 if (padding > result.Length) { result = result.PadLeft(padding, paddingChar); } return result; } }
3. 算法原理详解
3.1 字符串转数值算法(ToUInt64)
此算法采用权重累加法,从字符串的最右字符(最低位)开始处理,每位数值乘以其权重(基数的幂次)后累加。
算法步骤解析:
- 参数验证:检查输入字符串是否为空,修正进制基数到有效范围(2-36)
- 字符映射:将每个字符转换为对应的数值(0-9对应0-9,A-Z/a-z对应10-35)
- 权重计算:从最低位开始,每位权重是基数的递增幂次(基数的0次方、1次方、2次方…)
- 结果累加:将每位数值乘以其权重后累加到最终结果
示例:二进制"1101"转换为十进制
1×2³ + 1×2² + 0×2¹ + 1×2⁰ = 8 + 4 + 0 + 1 = 13
3.2 数值转字符串算法(ToString)
此算法采用除基取余法,通过反复除以基数并记录余数来实现转换。
算法步骤解析:
- 特殊情况处理:数值为0时直接返回"0"
- 除基取余:反复将数值除以基数,记录每次的余数
- 字符映射:将余数映射为字符集中的对应字符
- 结果构建:将映射的字符从后向前拼接(逆序)
- 填充处理:在结果前填充指定字符以达到最小长度要求
示例:十进制13转换为二进制
13 ÷ 2 = 6 余 1 → "1"
6 ÷ 2 = 3 余 0 → "01" 3 ÷ 2 = 1 余 1 → "101"1 ÷ 2 = 0 余 1 → "1101"
4. 关键位置
4.1 字符映射机制
工具类使用_keys
字符串作为字符映射表,其中0-9对应数字0-9,A-Z对应数字10-35。这种设计支持最大36进制转换,且通过统一的映射表提高代码可维护性。
4.2 错误处理与边界条件
- 空值处理:空字符串或null值返回0,避免异常
- 进制范围:自动修正超出2-36范围的进制参数
- 非法字符:遇到非法字符时返回0,保证程序稳定性
- 数值越界:使用ulong类型支持更大数值范围
5. 使用示例与场景
5.1 基础转换示例
// 字符串转数值 Console.WriteLine(RadixConverter.ToInt64("1A", 16)); // 输出:26(16进制转10进制) Console.WriteLine(RadixConverter.ToDouble("1010", 2)); // 输出:10(二进制转double) // 数值转字符串 Console.WriteLine(RadixConverter.ToString(26, 16)); // 输出:"1A"(10进制转16进制) Console.WriteLine(RadixConverter.ToString(10, 2, 8)); // 输出:"00001010"(填充至8位) // 高进制转换(32进制) Console.WriteLine(RadixConverter.ToString(100, 32)); // 输出:"34"
5.2 实际应用场景
- 短URL生成:使用高进制(如36进制)将长数字转换为短字符串
- 数据压缩:高进制表示可以更紧凑地存储数值数据
- 编码解码:自定义进制用于简单加密或编码方案
- 系统间数据交换:不同系统可能使用不同进制表示数据
6. 总结
本文详细介绍了C#中2~36进制转换的完整实现,涵盖了算法原理、代码实现和实际应用。该工具类具有良好的健壮性和扩展性,可以满足大多数进制转换需求。
到此这篇关于C#实现2~36进制转换的完整代码的文章就介绍到这了,更多相关C#进制转换内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论