C#實(shí)現(xiàn)2~36進(jìn)制轉(zhuǎn)換的完整代碼
1. 引言:進(jìn)制轉(zhuǎn)換的重要性
進(jìn)制轉(zhuǎn)換是計(jì)算機(jī)科學(xué)中的基礎(chǔ)技能,在編程開發(fā)、網(wǎng)絡(luò)通信、數(shù)據(jù)加密等領(lǐng)域有著廣泛應(yīng)用。雖然C#提供了Convert類等內(nèi)置轉(zhuǎn)換方法,但自定義進(jìn)制轉(zhuǎn)換工具類能提供更大的靈活性,特別是支持2~36進(jìn)制的任意轉(zhuǎn)換。本文將深入解析一個(gè)完整的進(jìn)制轉(zhuǎn)換工具類,逐行分析代碼實(shí)現(xiàn),并通過流程圖直觀展示算法原理。
進(jìn)制轉(zhuǎn)換的本質(zhì)是將數(shù)字從一種表示系統(tǒng)轉(zhuǎn)換為另一種表示系統(tǒng)。例如二進(jìn)制使用0和1兩個(gè)數(shù)字,十六進(jìn)制使用0-9和A-F共16個(gè)字符。而36進(jìn)制則使用0-9和A-Z所有字符,能夠更緊湊地表示大數(shù)字。
2. 進(jìn)制轉(zhuǎn)換工具類完整實(shí)現(xiàn)
以下是一個(gè)完整的C#進(jìn)制轉(zhuǎn)換工具類,支持2~36進(jìn)制之間的相互轉(zhuǎn)換:
using System;
/// <summary>
/// 進(jìn)制轉(zhuǎn)換工具類,支持2~36進(jìn)制之間的轉(zhuǎn)換
/// </summary>
public static class RadixConverter
{
// 字符集定義:0-9和A-Z分別表示0~35
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private static readonly string _keys = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
/// <summary>
/// 將字符串轉(zhuǎn)換為double類型
/// </summary>
/// <param name="v">要轉(zhuǎn)換的字符串</param>
/// <param name="radix">進(jìn)制基數(shù)(2-36)</param>
/// <returns>轉(zhuǎn)換后的double值</returns>
public static double ToDouble(string v, int radix) => BitConverter.Int64BitsToDouble(ToInt64(v, radix));
/// <summary>
/// 將字符串轉(zhuǎn)換為long類型
/// </summary>
public static long ToInt64(string v, int radix) => (long)ToUInt64(v, radix);
/// <summary>
/// 核心方法:將字符串轉(zhuǎn)換為ulong(支持2~36進(jìn)制)
/// </summary>
public static ulong ToUInt64(string v, int radix)
{
// 處理空字符串或null值
if (string.IsNullOrEmpty(v))
{
return 0;
}
// 進(jìn)制參數(shù)驗(yàn)證與修正
if (radix < 2)
{
radix = 10; // 默認(rèn)使用十進(jìn)制
}
else if (radix > _keys.Length)
{
radix = _keys.Length; // 最大不能超過字符集長(zhǎng)度
}
ulong result = 0; // 存儲(chǔ)轉(zhuǎn)換結(jié)果
ulong baseValue = (ulong)radix; // 進(jìn)制基數(shù)
ulong weight = 0; // 當(dāng)前位的權(quán)重(基數(shù)的冪次)
// 從字符串末尾向前遍歷(從低位到高位)
for (int i = v.Length - 1; i > -1; i--)
{
char ch = v[i];
ulong digitValue;
// 字符到數(shù)字的映射轉(zhuǎn)換
if (ch >= '0' && ch <= '9')
{
digitValue = (ulong)(ch - '0'); // 數(shù)字0-9直接轉(zhuǎn)換
}
else if (ch >= 'A' && ch <= 'Z')
{
digitValue = 10 + (ulong)(ch - 'A'); // 大寫字母A-Z對(duì)應(yīng)10-35
}
else if (ch >= 'a' && ch <= 'z')
{
digitValue = 10 + (ulong)(ch - 'a'); // 小寫字母a-z對(duì)應(yīng)10-35
}
else
{
return 0; // 非法字符返回0
}
// 檢查數(shù)字是否有效(不能大于等于基數(shù))
if (digitValue >= baseValue)
{
return 0;
}
// 計(jì)算當(dāng)前位的貢獻(xiàn)值
if (i == v.Length - 1) // 最低位(權(quán)重為1)
{
result += digitValue;
weight = baseValue; // 初始化權(quán)重
}
else // 高位:權(quán)重遞增
{
result += digitValue * weight;
weight = weight * baseValue; // 權(quán)重乘以基數(shù)
}
}
return result;
}
// 以下為數(shù)值轉(zhuǎn)字符串的重載方法
public static string ToString(long v, int radix) => ToString(v, radix, 0);
public static string ToString(ulong v, int radix) => ToString(v, 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轉(zhuǎn)換為字符串
/// </summary>
public static string ToString(double v, int radix, int padding, char paddingChar)
=> ToString(BitConverter.DoubleToInt64Bits(v), radix, padding, paddingChar);
/// <summary>
/// 將long轉(zhuǎn)換為字符串
/// </summary>
public static string ToString(long v, int radix, int padding, char paddingChar)
=> ToString((ulong)v, radix, padding, paddingChar);
/// <summary>
/// 核心方法:將ulong數(shù)值轉(zhuǎn)換為指定進(jìn)制的字符串
/// </summary>
public static string ToString(ulong v, int radix, int padding, char paddingChar)
{
// 進(jìn)制參數(shù)驗(yàn)證
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;
// 使用除基取余法進(jìn)行轉(zhuǎn)換
while (v > 0)
{
ulong remainder = v % baseValue; // 計(jì)算當(dāng)前余數(shù)
result = _keys[(int)remainder] + result; // 將余數(shù)映射為字符并拼接到結(jié)果前
v /= baseValue; // 更新商值
}
}
// 填充處理:確保結(jié)果達(dá)到指定長(zhǎng)度
if (padding > result.Length)
{
result = result.PadLeft(padding, paddingChar);
}
return result;
}
}
3. 算法原理詳解
3.1 字符串轉(zhuǎn)數(shù)值算法(ToUInt64)
此算法采用權(quán)重累加法,從字符串的最右字符(最低位)開始處理,每位數(shù)值乘以其權(quán)重(基數(shù)的冪次)后累加。

算法步驟解析:
- 參數(shù)驗(yàn)證:檢查輸入字符串是否為空,修正進(jìn)制基數(shù)到有效范圍(2-36)
- 字符映射:將每個(gè)字符轉(zhuǎn)換為對(duì)應(yīng)的數(shù)值(0-9對(duì)應(yīng)0-9,A-Z/a-z對(duì)應(yīng)10-35)
- 權(quán)重計(jì)算:從最低位開始,每位權(quán)重是基數(shù)的遞增冪次(基數(shù)的0次方、1次方、2次方…)
- 結(jié)果累加:將每位數(shù)值乘以其權(quán)重后累加到最終結(jié)果
示例:二進(jìn)制"1101"轉(zhuǎn)換為十進(jìn)制
1×2³ + 1×2² + 0×2¹ + 1×2? = 8 + 4 + 0 + 1 = 13
3.2 數(shù)值轉(zhuǎn)字符串算法(ToString)
此算法采用除基取余法,通過反復(fù)除以基數(shù)并記錄余數(shù)來實(shí)現(xiàn)轉(zhuǎn)換。

算法步驟解析:
- 特殊情況處理:數(shù)值為0時(shí)直接返回"0"
- 除基取余:反復(fù)將數(shù)值除以基數(shù),記錄每次的余數(shù)
- 字符映射:將余數(shù)映射為字符集中的對(duì)應(yīng)字符
- 結(jié)果構(gòu)建:將映射的字符從后向前拼接(逆序)
- 填充處理:在結(jié)果前填充指定字符以達(dá)到最小長(zhǎng)度要求
示例:十進(jìn)制13轉(zhuǎn)換為二進(jìn)制
13 ÷ 2 = 6 余 1 → "1"
6 ÷ 2 = 3 余 0 → "01"
3 ÷ 2 = 1 余 1 → "101"
1 ÷ 2 = 0 余 1 → "1101"
4. 關(guān)鍵位置
4.1 字符映射機(jī)制
工具類使用_keys字符串作為字符映射表,其中0-9對(duì)應(yīng)數(shù)字0-9,A-Z對(duì)應(yīng)數(shù)字10-35。這種設(shè)計(jì)支持最大36進(jìn)制轉(zhuǎn)換,且通過統(tǒng)一的映射表提高代碼可維護(hù)性。
4.2 錯(cuò)誤處理與邊界條件
- 空值處理:空字符串或null值返回0,避免異常
- 進(jìn)制范圍:自動(dòng)修正超出2-36范圍的進(jìn)制參數(shù)
- 非法字符:遇到非法字符時(shí)返回0,保證程序穩(wěn)定性
- 數(shù)值越界:使用ulong類型支持更大數(shù)值范圍
5. 使用示例與場(chǎng)景
5.1 基礎(chǔ)轉(zhuǎn)換示例
// 字符串轉(zhuǎn)數(shù)值
Console.WriteLine(RadixConverter.ToInt64("1A", 16)); // 輸出:26(16進(jìn)制轉(zhuǎn)10進(jìn)制)
Console.WriteLine(RadixConverter.ToDouble("1010", 2)); // 輸出:10(二進(jìn)制轉(zhuǎn)double)
// 數(shù)值轉(zhuǎn)字符串
Console.WriteLine(RadixConverter.ToString(26, 16)); // 輸出:"1A"(10進(jìn)制轉(zhuǎn)16進(jìn)制)
Console.WriteLine(RadixConverter.ToString(10, 2, 8)); // 輸出:"00001010"(填充至8位)
// 高進(jìn)制轉(zhuǎn)換(32進(jìn)制)
Console.WriteLine(RadixConverter.ToString(100, 32)); // 輸出:"34"
5.2 實(shí)際應(yīng)用場(chǎng)景
- 短URL生成:使用高進(jìn)制(如36進(jìn)制)將長(zhǎng)數(shù)字轉(zhuǎn)換為短字符串
- 數(shù)據(jù)壓縮:高進(jìn)制表示可以更緊湊地存儲(chǔ)數(shù)值數(shù)據(jù)
- 編碼解碼:自定義進(jìn)制用于簡(jiǎn)單加密或編碼方案
- 系統(tǒng)間數(shù)據(jù)交換:不同系統(tǒng)可能使用不同進(jìn)制表示數(shù)據(jù)
6. 總結(jié)
本文詳細(xì)介紹了C#中2~36進(jìn)制轉(zhuǎn)換的完整實(shí)現(xiàn),涵蓋了算法原理、代碼實(shí)現(xiàn)和實(shí)際應(yīng)用。該工具類具有良好的健壯性和擴(kuò)展性,可以滿足大多數(shù)進(jìn)制轉(zhuǎn)換需求。
到此這篇關(guān)于C#實(shí)現(xiàn)2~36進(jìn)制轉(zhuǎn)換的完整代碼的文章就介紹到這了,更多相關(guān)C#進(jìn)制轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C#實(shí)現(xiàn)tostring轉(zhuǎn)換成16進(jìn)制的方法
- C#實(shí)現(xiàn)十進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制的幾種方式
- C#實(shí)現(xiàn)字符串進(jìn)制轉(zhuǎn)換方法匯總
- C#實(shí)現(xiàn)十六進(jìn)制與十進(jìn)制相互轉(zhuǎn)換以及及不同進(jìn)制表示
- C#實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換
- C# 進(jìn)制轉(zhuǎn)換的實(shí)現(xiàn)(二進(jìn)制、十六進(jìn)制、十進(jìn)制互轉(zhuǎn))
- C#中圖片、二進(jìn)制與字符串的相互轉(zhuǎn)換方法
相關(guān)文章
C#中Thread(線程)和Task(任務(wù))實(shí)例詳解
.NET Framework在System.Threading命名空間中具有與線程相關(guān)的類,線程是一小組可執(zhí)行指令,這篇文章主要給大家介紹了關(guān)于C#中Thread(線程)和Task(任務(wù))的相關(guān)資料,需要的朋友可以參考下2022-03-03
C#實(shí)現(xiàn)獲取Excel中圖片所在坐標(biāo)位置
本文以C#和vb.net代碼示例展示如何來獲取Excel工作表中圖片的坐標(biāo)位置,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-04-04
Unity實(shí)現(xiàn)高效的音效管理類的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何通過Unity實(shí)現(xiàn)高效的音效管理類,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以了解一下2023-03-03
C#實(shí)現(xiàn)的簡(jiǎn)單鏈表類實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的簡(jiǎn)單鏈表類,涉及C#針對(duì)鏈表的定義、實(shí)現(xiàn)及鏈表節(jié)點(diǎn)的增加、刪除與修改技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
c#讀取圖像保存到數(shù)據(jù)庫(kù)中(數(shù)據(jù)庫(kù)保存圖片)
這篇文章主要介紹了使用c#讀取圖像保存到數(shù)據(jù)庫(kù)中的方法,大家參考使用吧2014-01-01
Unity打開淘寶app并跳轉(zhuǎn)到商品頁(yè)面功能的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于如何利用Unity打開淘寶app并跳轉(zhuǎn)到商品頁(yè)面功能的相關(guān)資料,這個(gè)功能目前在網(wǎng)上找不到相關(guān)的解決方法,所以自己寫了出來,需要的朋友可以參考下2021-07-07
深入淺析c#靜態(tài)多態(tài)性與動(dòng)態(tài)多態(tài)性
多態(tài)就是多種形態(tài),也就是對(duì)不同對(duì)象發(fā)送同一個(gè)消息,不同對(duì)象會(huì)做出不同的響應(yīng)。這篇文章主要介紹了c#靜態(tài)多態(tài)性與動(dòng)態(tài)多態(tài)性的相關(guān)知識(shí),需要的朋友可以參考下2018-09-09

