C#进制之间的相互转换详解

下面笔者说说自己对进制转换的分析:

笔者认为,任何进制都可以直接转换到十进制,而十进制也可以相当容易的转换到其他进制,所以笔者在这里将十进制作为中间变量,任何进制通过它,都可以进行相互转换.

笔者先说说将其他进制转换到十进制的方式

代码如下:

/// <summary>
        /// 其他进制转化到10进制
        /// </summary>
        /// <param name="num">需转换字符</param>
        /// <param name="format">转化到;如转换到2进制,这里键入2</param>
        /// <returns></returns>
        public static long ConverHexToTen(string num, int format)
        {long allCount = 0;
            for (int i = 0; i < num.Length; i++)
            {
                string s = num.Substring(i, 1);
                int n = 0;
                if (!int.TryParse(s, out n)) {
                    n= GetNumberByStr(s);
                }
                if (n < 0)
                    throw new Exception("输入字符有误,请确保该字符真实存在");

if (n > 0)
                {
                    long count = 1;
                    for (int j = 0; j < num.Length - i - 1; j++)
                    {
                        count *= format;
                    }
                    count *= n;
                    allCount += count;
                }

}
            return allCount;
        }

allCount:用于保存转换后的十进制数据

n:保存十六进制或者32进制返回的数据;(16进制与32进制包含了字符,所以这里必须根据相应的字符进行转换)

这里,如果n>0,这里则需要进行计算,算法我已经写在for循环中了,下面具体说说这个算法

从外层循环开始:

num.length:当前进制的字符总长;这里循环它,主要是为了得到它每一位的数据大小,最后叠加;

有朋友问我,为什么不适用foreach呢,这样就不用substring截取了.至于原因,我后面在说吧;

这里有个方法,GetNumberByStr(string s):这里主要是处理16进制与32进制的,也就是带字母的数据转换.\

在定义这个方法前,我们需要定义一个参数,用于保存这些数据

代码如下:

private static string ThreeSix = "ABCDEFGHIJKLMNOPQISTUVWXYZ";

下面我们来写GetNumberByStr这个方法

代码如下:

/// <summary>
        /// 根据字符,获取对应的十进制数据
        /// </summary>
        /// <param name="c"></param>
        /// <returns></returns>
        private static Int32 GetNumberByStr(string c)
        {
            int i = ThreeSix.IndexOf(c);
            if (i < 0)
                return i;
            return i + 10;
        }

获取当前字母所在位置,在结果后追加10,如此,便可以得到我们所需要的相应字符,二进制八进制是不需要进入这个方法的

好,我们继续说;当数据真实存在(当前位数大于0,等于0则不用去操作)时,定义count=1,用于保存当前位转换后的十进制数据

内存循环;这里主要是看看当前位数是当前进制的几次方,如二进制的1110,从左向右算,第一位应该是2的3次方,以此类推,第四位应该是二的0次方,这里的循环就是做了这样的操作,相应的,当前所在位置的次方也就是字符长度-i-1,这里就是我为什么要保留for循环,留下i的原因;format也就是进制,二进制则为2.八进制则为8;最后,很重要的一个操作,

count*=n;这个对于二进制来说作用并不大,也可以说是没有作用,因为二进制最大的数字就是1,所以可以忽略不计,但是其他进制则需要,当前位的数字表示了当前我们算出的结果倍数.如32进制的10;其实就是32,20则为64.就是这样得出的

最后都追加到allCount.return出去.ok,我们已经完成了其他进制到十进制的转换,下面我们只要转回去就可以了;

代码如下

代码如下:

/// <summary>
        /// 10进制转化成其他进制
        /// </summary>
        /// <param name="number">需转换字符</param>
        /// <param name="format">转化到;如转换到2进制,这里键入2</param>
        /// <returns></returns>
        public static string ConverHex(long number, int format)
        {
            if (number == 0)
                return number + "";
            StringBuilder str = new StringBuilder();
            while (number > 0)
            {
                str.Insert(0, SixFont((number % format)));
                number /= format;
            }
            return str.ToString();
        }

代码如下:

/// <summary>
        /// 获取相应的字符,16进制与32进制需要使用
        /// </summary>
        /// <param name="num"></param>
        /// <returns></returns>
        private static string SixFont(long num)
        {
            if (num < 10)
                return num + "";
            return ThreeSix.Substring((int)num - 10, 1);
        }

方法很简单,不到10行代码,我要说的只有2点

1:这里str用于拼接数据,要注意的是,这里得出的每一位的结果,需要追加到最前面,所以使用insert来插入到第一位

2:SixFont(long num):这个方法是用于转换数据的,用于16和32进制,大于10的数据是字符,我的处理方式是截取字符串,避免过多的判断或者case;

恩,这样就基本完成了,其他进制之间的转换也就可以通过这样的方式来完成了

还有不理解的朋友可以联系我qq(1772282755);源码地址http://xiazai.jb51.net/201311/yuanma/jinzhizhuanhuan(jb51.net).rar

(0)

相关推荐

  • c#实现16进制和字符串之间转换的代码

    十六进制字符串与数值类型之间转换(C# 编程指南) 以下示例演示如何执行下列任务: 获取字符串中每个字符的十六进制值. 获取与十六进制字符串中的每个值对应的字符. 将十六进制 string 转换为整型. 将十六进制 string 转换为浮点型. 将字节数组转换为十六进制 string. 示例 此示例输出 string 中的每个字符的十六进制值.首先,它将 string 分析为字符数组,然后对每个字符调用 ToInt32(Char) 以获取相应的数字值.最后,在 string 中将数字的格式设置为

  • C# 16进制与字符串、字节数组之间的转换

    复制代码 代码如下: /// <summary> /// 字符串转16进制字节数组 /// </summary> /// <param name="hexString"></param> /// <returns></returns> private static byte[] strToToHexByte(string hexString) { hexString = hexString.Replace(&quo

  • C#进制之间的相互转换详解

    下面笔者说说自己对进制转换的分析: 笔者认为,任何进制都可以直接转换到十进制,而十进制也可以相当容易的转换到其他进制,所以笔者在这里将十进制作为中间变量,任何进制通过它,都可以进行相互转换. 笔者先说说将其他进制转换到十进制的方式 复制代码 代码如下: /// <summary>        /// 其他进制转化到10进制        /// </summary>        /// <param name="num">需转换字符</pa

  • java 进制转换实例详解

    java 进制转换实例详解 十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinaryString(int i) 十六进制转成十进制 Integer.valueOf("FFFF",16).toString() 八进制转成十进制 Integer.valueOf("876",8).toString() 二进制转十进制 Integ

  • 对python3.4 字符串转16进制的实例详解

    如下所示: def str_to_hex(s):     s = s.split(' ')     send_buf = b''     for i in range(len(s)):         send_buf  += struct.pack('B',int(s[i],16))     return(send_buf) 以上这篇对python3.4 字符串转16进制的实例详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Python进制转换用法详解

    目录 使用int()转换 任意字符数字转换为10进制: 16进制转换为10进制:int(x,16) 8进制转换为10进制:int(x,8) 2进制转换为10进制:int(x,2) 使用bin(x) ,oct(x) 或hex(x) 转换: bin(x)转换为二进制: oct(x)转换为八进制: hex(x)转换为十六进制: 使用format() 转换 format(x,'b')转换为二进制 format(x,'o')转换为八进制 format(x,'d')转换为十进制 format(x,'x')转

  • Java基本数据类型之间的相互转换详解

    目录 1.自动类型转换 1.定义 2.数据类型按精度大小排序 3.使用细节 2.强制类型转换 1.定义 2.使用细节 3.基本数据类型与String类型的转换 1.基本数据类型转String类型 2.String类型转基本数据类型 今天主要学习的是Java基本数据类型之间的转换以及String类型与基本数据类型之间的转换 1.自动类型转换 1.定义 Java程序在进行赋值或运算时,自动将精度小的转换成精度大的. 2.数据类型按精度大小排序 char —> int —> long —> f

  • Go语言中基本数据类型的相互转换详解

    目录 基本数据类型的相互转换 基本语法 小知识 基本数据类型和string的转换 方法一 方法二 string和基本数据类型转换 基本数据类型的相互转换 Go在不同类型的变量之间赋值时需要显示转换,不能自动转换 基本语法 表达式 T(v): 将值v转换成类型T T就是数据类型: int32, int64, float32... v就是需要转换的变量 1.不考虑溢出的情况下,类型转换不会改变数值大小 var i int8 = 100 var n int32 = int32(i) fmt.Print

  • java list,set,map,数组间的相互转换详解

    java list,set,map,数组间的相互转换详解 1.list转set Set set = new HashSet( new ArrayList()); 2.set转list List list = new ArrayList( new HashSet());  3.数组转为list List stooges = Arrays.asList( "Larry" , "Moe" , "Curly" ); 此时stooges中有有三个元素.注意

  • Java Date与String的相互转换详解

    Java Date与String的相互转换详解 前言: 我们在注册网站的时候,往往需要填写个人信息,如姓名,年龄,出生日期等,在页面上的出生日期的值传递到后台的时候是一个字符串,而我们存入数据库的时候确需要一个日期类型,反过来,在页面上显示的时候,需要从数据库获取出生日期,此时该类型为日期类型,然后需要将该日期类型转为字符串显示在页面上,Java的API中为我们提供了日期与字符串相互转运的类DateForamt.DateForamt是一个抽象类,所以平时使用的是它的子类SimpleDateFor

  • 对numpy的array和python中自带的list之间相互转化详解

    a=([3.234,34,3.777,6.33]) a为python的list类型 将a转化为numpy的array: np.array(a) array([ 3.234, 34. , 3.777, 6.33 ]) 将a转化为python的list a.tolist() 以上这篇对numpy的array和python中自带的list之间相互转化详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们. 您可能感兴趣的文章: Python创建二维数组实例(关于list的一个

  • Python3进制之间的转换代码实例

    Python3进制之间的转换 在Python里面实现进制之间的转换是非常方便的,有专门的函数来进行这个操作: 下面直接上代码: # 进制之间的转换 a = 10 # 转换为二进制 print(bin(a)) # 结果为0b1010 # 转换为八进制 print(oct(a)) # 结果为0o12 # 转换为八进制 print(hex(a)) # 结果为0xa # 一个非十进制的数转换为十进制 print(int(0b1010)) # 结果为10 以上就是本文的全部内容,希望对大家的学习有所帮助,

随机推荐