2012-03-04 85 views
4

是否有现成的函数可以在c#中进行基础转换?我期待从基数26和底数基数27转换为基数10.我可以在纸上做,但我不是一个非常有经验的程序员,如果可能的话,不要从头开始。谢谢!在C#中将base-27(或base-X)转换为base-10?

+1

“你试过什么”? (希望看到一个尝试,即使没有完全正常工作,因为可以讨论具体细节并且已经展示了工作。) – 2012-03-04 21:50:56

+0

另外,考虑查看*现有* base64编码器/解码器;它只是在数学上略有不同(而不是'/'或'%'64,'/'或'%'27等),但这个想法是一样的。 – 2012-03-04 21:52:10

+0

pst:我还没有尝试过任何东西,因为如果有东西存在,我不想写它。我不是以任何方式要求完成代码,我只是寻找一些方向。谢谢! – miltonjbradley 2012-03-04 21:57:41

回答

3

有一个现成的功能,可将数字从基数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); 
} 

我想到的第一个版本更具可读性,虽然。

+0

现在我想知道,我可以用LINQ表达式来做这件事吗? – zmbq 2012-03-04 22:06:12

+0

是的,我编辑了答案。 – zmbq 2012-03-04 22:11:34

+0

从技术上讲,'Convert.ToInt32'将数字转换为基数2.它是'Int32.ToString',将它们转换为10。 – dan04 2012-04-26 22:44:30

0

建立你的答案。您不需要字符集查找列表,因为您只需使用char ASCII值即可。

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

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