Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中从Base36到十进制的译码_C# - Fatal编程技术网

C# C语言中从Base36到十进制的译码

C# C语言中从Base36到十进制的译码,c#,C#,我正在使用一种方法将一个值从base36解码为十进制。这种方法效果很好 但当我开始解码000A的输入值时,事情就开始出错了 将其解码为-1 有人知道出了什么问题吗?我真的对代码和它的工作原理感到困惑 public static Int64 Decode(string input) { var reversed = input.ToLower().Reverse(); long result = 0; int

我正在使用一种方法将一个值从base36解码为十进制。这种方法效果很好 但当我开始解码000A的输入值时,事情就开始出错了 将其解码为-1

有人知道出了什么问题吗?我真的对代码和它的工作原理感到困惑

public static Int64 Decode(string input)
        {
            var reversed = input.ToLower().Reverse();
            long result = 0;
            int pos = 0;
            foreach (char c in reversed)
            {
                result += CharList.IndexOf(c) * (long)Math.Pow(36, pos);
                pos++;
            }
            return result;
        }

我只能假设您的字符列表不包含,因此IndexOfc返回-1以表示未找到该字符。请记住,默认情况下IndexOf是区分大小写的,所以如果您在CharList中使用小写字母,而在c中使用大写字母,那么它将不匹配

private const string CharList = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

我只能假设您的字符列表不包含,因此IndexOfc返回-1以表示未找到该字符。请记住,默认情况下IndexOf是区分大小写的,所以如果您在CharList中使用小写字母,而在c中使用大写字母,那么它将不匹配

private const string CharList = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
您在源代码中使用的是ToLower,并且列表中只包含大写字符,因此IndexOf'a'返回-1

我想您应该改用ToUpper。

您在源代码上使用的是ToLower,并且您的列表只包含大写字符,因此IndexOf'a'返回-1


我想您应该改用ToUpper。

您可以使用Linq简洁地执行此任务,并完全避免使用字符表&支持从任意基数2到36再到基数10的转换,如下所示:

// pos = 0
result += CharList.IndexOf(c) * (long)Math.Pow(36, pos);
// pos = 36^0 = 1
// CharList.IndexOf(c) gives -1 when not found
// therefore, it equates to:
result += -1 * 1
从10号底面到任意底面的完整性:

string b36 = "000A", tbase = 36;
int b10 = b36
       .Select(d => d >= '0' && d <= '9' ? d - '0' : 10 + char.ToUpper(d) - 'A')
       .Aggregate(0, (pos, d) => pos * tbase + d);

您可以使用Linq简洁地执行此任务,并完全避免使用字符表&支持从任何基2到基36到基10的转换,如下所示:

// pos = 0
result += CharList.IndexOf(c) * (long)Math.Pow(36, pos);
// pos = 36^0 = 1
// CharList.IndexOf(c) gives -1 when not found
// therefore, it equates to:
result += -1 * 1
从10号底面到任意底面的完整性:

string b36 = "000A", tbase = 36;
int b10 = b36
       .Select(d => d >= '0' && d <= '9' ? d - '0' : 10 + char.ToUpper(d) - 'A')
       .Aggregate(0, (pos, d) => pos * tbase + d);

下面是一个递归函数:

int value = 10, tbase = 36;
string result = "";
while (value > 0)
{
    int x = value % tbase;
    result = (char)(x >= 0 && x <= 9 ? x + 48 : x + 'A' - 10) + result;
    value /= tbase;
}
Console.WriteLine(result.PadLeft(4,'0'));

下面是一个递归函数:

int value = 10, tbase = 36;
string result = "";
while (value > 0)
{
    int x = value % tbase;
    result = (char)(x >= 0 && x <= 9 ? x + 48 : x + 'A' - 10) + result;
    value /= tbase;
}
Console.WriteLine(result.PadLeft(4,'0'));

事实上,我觉得很好。查理斯特长什么样?@leppie-不,没错。对于pos=0,您将得到1,这将为您提供1*值,其中value只是最低有效字符的位置。对于pos=1,您将得到36,这将为下一个最低有效字符提供36*的值,等等!周末还有5分钟。我看到了你编辑过的问题:看@polymonal答案,因为它是适合你的!您正在使用IndexOfc,其中c是小写,而CharList是大写!!使用数学。Pow也是一个非常糟糕的主意。在这样的问题上使用[家庭作业]标签。事实上,在我看来很好。查理斯特长什么样?@leppie-不,没错。对于pos=0,您将得到1,这将为您提供1*值,其中value只是最低有效字符的位置。对于pos=1,您将得到36,这将为下一个最低有效字符提供36*的值,等等!周末还有5分钟。我看到了你编辑过的问题:看@polymonal答案,因为它是适合你的!您正在使用IndexOfc,其中c是小写,而CharList是大写!!使用数学。Pow也是一个非常糟糕的主意。在像这样的问题上使用[家庭作业]标签。事实上恰恰相反:c是小写,而CharList是大写;不管怎样,你的回答是正确的!向上投票!事实恰恰相反:c是小写,而CharList是大写;不管怎样,你的回答是正确的!向上投票!