2010-07-29 89 views
1

我有一個方法可以將int轉換爲基數60 string(使用0-9,a-z和A-Z字符),但無法解決如何將其轉換回來。這裏是我將base10轉換爲base60的方法:從基數60轉換爲基數10

public static function toBase60(value:Number):String 
{ 
    var targetBase:uint = 60; 
    value = value.toString().split('.')[0]; 
    var digits:Array = new Array(); 
    while (value > 0) 
    { 
     digits.push(baseChars[value % targetBase]); 
     value = Math.floor(value/targetBase); 
    } 
    var myResult:String = digits.reverse().join(''); 
    return myResult; 
} 

工作的很好。但是,如何將base60字符串返回到base10 int?我碰巧使用的是ActionScript 3,但實際上,任何編程語言,泛型解釋或sudo代碼都是很好的例子。

回答

2

一個做的方式這可能是:

public static function fromBase60(value:String):Number { 
     var result:Number = 0; 
     var targetBase:uint = 60; 
     var digitValue:int = 0; 
     for(var i:int = 0, j:int = value.length - 1; j >= 0; i++,j--) { 
      digitValue = reverseMap[value.charAt(j)]; 
      result += Math.pow(targetBase,i) * digitValue; 
     } 
     return result; 
    } 

看起來你有一個數組,地圖數字(數字)字符,這樣你就可以建立一個反向映射前期,使查找更容易。對於一些像這樣的代碼:

// add this code to your class 
    private static var reverseMap:Object = {}; 

    private static function buildReverseMap():void { 
     var len:int = baseChars.length; 
     for(var i:int = 0; i < len; i++) { 
      reverseMap[baseChars[i]] = i; 
     } 
    } 

    // initialize the reverse map 
    { 
     buildReverseMap(); 
    } 

編輯

替代實現,基於算法張貼由湯姆·Sirgedas。這避免調用Math.pow,但我懷疑你會注意到,在實踐太大的差別(性能明智):

public static function fromBase60(value:String):Number { 
     var result:Number = 0; 
     var targetBase:uint = 60; 
     var digitValue:int = 0; 
     var len:int = value.length; 
     for(var i:int = 0; i < len; i++) { 
      digitValue = reverseMap[value.charAt(i)]; 
      result = result * targetBase + digitValue; 
     } 
     return result; 
    } 
4
total = 0; 
for each digit (front to back) 
    total = total * 60 + digit 
+0

不應該是'總數** 60 *數字',其中** **是取冪? – Adrian 2010-07-29 01:02:30

+0

不,它是好的方式 – fazo 2010-07-29 01:05:39

+0

@Adrian:例如,93,[基數60]是543 [基數10](9 * 60 + 3)。另外,7000 [基準60]是7 *(60 ** 3)。我的代碼通過乘以7乘以60三次。 – 2010-07-29 01:11:19

0

假設你有一個函數int digit60to10(char digit)該轉換[0-9A-ZA-Z]成一個單一的數字相等的十進制值,你可以這樣做:

int decimalValue = 0; 
foreach digit in digits (most to least significant): 
    decimalValue *= 60; 
    decimalValue += digit60to10(digit); 
0

這可能給你一些問題。但是,這不是基地60,這是基地62

編輯因爲上面是不是一個被視爲一個有效的答案,這裏是我如何在PHP轉化基地62 < => 10,雖然有很多方法來做所以。 http://ken-soft.com/?p=544

我也解釋了爲什麼我在下面的評論中發佈了一個答案(雖然我同意它太簡短):)對不起。
編輯爲什麼這會被拒絕?我說的是真的!

+0

這不是一個答案! – 2010-09-04 01:03:05

+0

嗯,它可能不是一個完整的答案,但我覺得這與解決你的問題有關,指出如果你使用Base 62字符集並試圖使用Base 60轉換它,那麼你的結果將是錯誤。 – 2010-09-04 01:44:36

+0

只要解碼器和編碼器知道基數爲60,就沒有什麼問題了。只有兩個字母是未使用的。 – hobbs 2010-09-04 01:47:50