欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#實(shí)現(xiàn)2~36進(jìn)制轉(zhuǎn)換的完整代碼

 更新時(shí)間:2025年10月12日 10:21:30   作者:liulilittle  
進(jìn)制轉(zhuǎn)換是計(jì)算機(jī)科學(xué)中的基礎(chǔ)技能,進(jìn)制轉(zhuǎn)換的本質(zhì)是將數(shù)字從一種表示系統(tǒng)轉(zhuǎn)換為另一種表示系統(tǒng),下面我們就來看看如何使用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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#中Thread(線程)和Task(任務(wù))實(shí)例詳解

    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#實(shí)現(xiàn)獲取Excel中圖片所在坐標(biāo)位置

    本文以C#和vb.net代碼示例展示如何來獲取Excel工作表中圖片的坐標(biāo)位置,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-04-04
  • Unity實(shí)現(xiàn)高效的音效管理類的示例代碼

    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)單鏈表類實(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ù)中(數(shù)據(jù)庫(kù)保存圖片)

    這篇文章主要介紹了使用c#讀取圖像保存到數(shù)據(jù)庫(kù)中的方法,大家參考使用吧
    2014-01-01
  • C#深淺拷貝的深入解析

    C#深淺拷貝的深入解析

    這篇文章主要給大家介紹了關(guān)于C#深淺拷貝的深入解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Unity打開淘寶app并跳轉(zhuǎn)到商品頁(yè)面功能的實(shí)現(xiàn)方法

    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#實(shí)現(xiàn)圖片合成功能

    基于C#實(shí)現(xiàn)圖片合成功能

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)圖片合成的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • C#時(shí)間戳基本使用方法詳解

    C#時(shí)間戳基本使用方法詳解

    這篇文章主要給大家介紹了關(guān)于C#時(shí)間戳基本使用方法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-10-10
  • 深入淺析c#靜態(tài)多態(tài)性與動(dòng)態(tài)多態(tài)性

    深入淺析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

最新評(píng)論