繁体   English   中英

从60转换为10

[英]convert from base 60 to base 10

我有一种方法可以将int转换为base60 string (使用0-9,az和AZ字符),但无法解决如何再次将其转换回原状态的问题。 这是我将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代码都很棒。

total = 0;
for each digit (front to back)
  total = total * 60 + digit

一种方法是:

    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;
    }

假设您有一个将int digit60to10(char digit) [0-9a-zA-Z]转换为一位数字的等效十进制值的int digit60to10(char digit)功能,则可以执行以下操作:

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

这可能会给您带来一些问题。 但这不是以60为底,而是以62为底

编辑由于上面的内容不是有效的答案,因此这是我如何在PHP中转换base 62 <=> 10的方法,尽管有许多方法可以这样做。 http://ken-soft.com/?p=544

我也解释了为什么我在以下评论中将其发布为答案(尽管我同意这太简短了):)抱歉。
编辑为什么这被否决了? 我说的是真的!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM