2012-03-04 59 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。