C#中关于进制的一些知识点

C#中如何定义

生活中常见的是10进制,计算机领域常见的有2进制、8进制、16进制,C#中定义方法如下。

int num1 = 0b00000001; //2进制
int num2 = 0xF;//16进制
int num3 = 100;//10进制
int num4 = ???;//8进制C#里表示不了

C#内置进制转换

用 c# 内置的 Convert.ToInt32("数字",进制) 可以将10进制转成(2、6、8、16)进制。如 Convert.ToInt32("12",8) ,将"12"转为8进制,结果为10。

如何自定义进制转换

简单点说,就是逢X进1。假如定义一个12进制,对应关系是这样

0 1 2 3 4 5 6 7 8 9 10 11 //10进制
0 1 2 3 4 5 6 7 8 9 X   Y //12进制 ,不一定要A,B表示

那么12进制的1X,就等于10进制的22。除了0-9,其实a-z 、A-Z、甚至其他特殊符号都可以拿来代表一个数字,前提是你的应用要能识别。这里简单定义一个[0-9 a-z A-Z]的字符串。

private static List<char> CHARS = Enumerable.Range(48, 10).Union(Enumerable.Range(65, 26)).Union(Enumerable.Range(97, 26)).Select(t => (char)t).ToList();

10进制转任意进制

public static string ToAnyBase(long num, int @base)
{
    long temp = num;
    string result = "";
    while (temp != 0)
    {
        long mod = temp % @base;
        temp = temp / @base;
        result = CHARS[(int)mod] + result;
    }
    return result;
}

从任意进制还原成10进制

public static long FromAnyBase(string str, int @base)
{
    if (string.IsNullOrEmpty(str)) return 0;
    return (long)str.Reverse().Select((s, i) => (CHARS.IndexOf(s)) * Math.Pow(@base, i)).Sum();
}

进制转换的一些应用

  • 颜色值

通常web上用RGB表示色值,分别取值在0-255,如果不用16进制,表示白色可能就是 255255255 ,用16进制 FFFFFF来表示,看上去要短一点,也好记一点。

  • 短网址

不管是微博、短信、百度评论里都有字数限制,长网址不利于推广,所以这里可以利用一下进制转换,将长网址存入数据库,得到一个自增ID,比如是8205414564,再转为62进制8xJ5AC,最后的网址可能是这样 t.cn/8xJ5AC 用户点击后,系统拿到8xJ5AC,再转为10进制,从数据库取出长网址进行301跳转。

  • 简单加密

其实算不上加密,只是简单把10进制升级一下,防止系统出现连续ID,比如百度网盘事件。