我有一个方法可以将int
转换为base60 string
(使用0-9,a-z和A-Z字符),但无法解决如何将其转换回来的问题。这是我将base10转换为base60的方法:
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代码都会很棒。
答案 0 :(得分:4)
total = 0;
for each digit (front to back)
total = total * 60 + digit
答案 1 :(得分: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();
}
修改强>
替代实施,基于Tom 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;
}
答案 2 :(得分: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);
答案 3 :(得分:0)
这可能会给你一些问题。但那不是Base 60,它是基础62
编辑由于上述内容未被视为有效答案,因此以下是我如何转换基础62&lt; =&gt; 10用PHP,虽然有很多方法可以做到这一点。 http://ken-soft.com/?p=544
我也解释了为什么我在下面的评论中将其作为答案发布(虽然我同意它太简短了):)抱歉。
编辑为什么会被投票?我说的是真的!