在C#中将基数为27(或基数为X)的数转换为十进制?

5

有没有现成的函数可以在C#中进行进制转换?我想要将基于26和基于27的数字转换为十进制。我能够手写实现,但是作为一个经验不足的程序员,如果可能的话,我宁愿不从零开始。谢谢!


1
你尝试过什么?(即使尝试不完全成功,也最好能够展示出来,这样可以讨论具体问题并展示出你的努力。) - user166390
另外,考虑查看现有的base64编码器/解码器;在数学上只是略有不同的数字(而不是通过64进行/%,而是通过27进行/%等),但思路是一样的。 - user166390
PST:我还没有尝试过任何东西,因为如果已经存在,我不想重复造轮子。我并不是要求完整的代码,只是希望能得到一些指引。谢谢! - miltonjbradley
请注意第二条评论 - 数学计算是相同的,除了使用的基数不同。此外,获取特定数字的数值可能需要不同的查找(例如,如果基数为26的数字是A-Z,而基数为64的数字是0-9A-Z...)。 - user166390
有点相关:https://dev59.com/vkXRa4cB1Zd3GeqPpzQi - user166390
3个回答

5

有一个现成的函数可以将数字从2进制、8进制或16进制转换为10进制(Convert.ToInt32)。如果您想将数字从26进制或27进制转换为10进制,则需要自行处理。

现在,我从未听说过26进制的数字,因此我假设“数字”是A到Z(A的值为0,Z的十进制值为25)。要将26进制转换为10进制,应该执行以下操作:

string charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int GetDigitValue(char digit)
{
    return charset.IndexOf(digit);
}
int ConvertFromBase26(string number)
{
    int result = 0;
    foreach(char digit in number)
        result = result * charset.Length + GetDigitValue(digit);

    return result;
}

要将数字转换为27进制,只需添加表示数字26的任何字符。

注意:没有错误纠正(您可以转换字符串"$ # $ @ # $ @",这会使您得到一个不错的负数),如果您计划经常执行这些转换,则GetDigitValue相当低效,应该将其替换为查找表。

编辑:为了好玩,还有一个LINQ版本。

同样,没有有效的查找和错误纠正,假设字符串仅由合法数字组成。

string charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int ConvertFromBase(string charset, string number)
{
    return number.Select(c=>charset.IndexOf(c)).Aggregate(0, (x, y) => x*charset.Length +y);
}

我认为第一版更易读。


从技术上讲,Convert.ToInt32 将数字转换为二进制。而 Int32.ToString 则将它们转换为十进制。 - dan04

0
在你的答案基础上,可以通过使用字符 ASCII 值来避免使用字符集查找列表。
int ConvertFromBase26(string number)
{
     return number.Select(digit => (int)digit - 64).Aggregate(0, (x, y) => x * 26 + y);
}

我在使用Excel编程时,使用这个工具将列字符串地址转换为整数。


0
假设您使用基于字母表的一进制的26进制(例如:A = 1,B = 2,...,Z = 26,AA = 27,...)
public int ToBase10(this string str)
{
    str = str.ToUpper();
    int number = 0;
    for (int index = 0; index < str.Length; index++)
        number += (str[index] - 'A' + 1) * (int)Math.Pow(26, str.Length - 1 - index);
    return number;
}

要调用此函数,只需像这样调用

string PlateNumber = "TRX";
int number = PlateNumber.ToBase10();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接