【问题标题】:Convert base-27 (or base-X) to base-10 in c#?在c#中将base-27(或base-X)转换为base-10?
【发布时间】:2012-03-22 11:32:10
【问题描述】:

是否有现成的函数可以在 c# 中进行基本转换?我希望从以 26 为基数和以 27 为基数的数字转换为以 10 为基数。我可以在纸上做到这一点,但我不是一个非常有经验的程序员,如果可能的话,我宁愿不要从头开始。谢谢!

【问题讨论】:

  • “你试过什么”? (希望看到尝试,即使没有完全奏效,因为这样可以讨论细节并证明努力。)
  • 另外,请考虑查看现有 base64 编码器/解码器;它只是在数学上略有不同(而不是/% 64,/% 27 等),但想法是一样的。
  • pst:我还没有尝试过任何东西,因为如果存在某些东西我不想写它。我不是以任何方式要求完成的代码,我只是在寻找一些方向。谢谢!
  • 感谢您的帮助,非常感谢
  • 注意第二条评论——除了使用的基础之外,数学是相同的。此外,可能需要不同的查找来获取特定数字的数值(例如,如果 base-26 数字是 A-Z,因为 base-64 是 0-9A-Z...)。

标签: c# decimal base


【解决方案1】:

有一个现成的函数可以将数字从基数 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 将数字转换为以 2 为底。Int32.ToString 将它们转换为以 10 为底。
【解决方案2】:

以您的答案为基础。您不需要字符集查找列表,因为您可以只使用字符 ASCII 值。

int ConvertFromBase26(string number)
{
     return number.Select(digit => (int)digit - 64).Aggregate(0, (x, y) => x * 26 + y);
}

我在用 Excel 编程时用它来将列字符串地址转换为 int。

【讨论】:

    猜你喜欢
    • 2022-10-23
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多