преобразовать из базы 60 в базу 10 - PullRequest
1 голос
/ 29 июля 2010

У меня есть метод, который преобразует 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 были бы хороши.

Ответы [ 4 ]

4 голосов
/ 29 июля 2010
total = 0;
for each digit (front to back)
  total = total * 60 + digit
2 голосов
/ 29 июля 2010

Один из способов сделать это может быть:

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

Редактировать

Альтернативная реализация, основанная на алгоритме, опубликованном Томом Сиргедасом. Это позволяет избежать вызова 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;
    }
0 голосов
/ 03 сентября 2010

Это может привести к некоторым проблемам. Но это не база 60, это база 62

Редактировать Поскольку вышеизложенное не рассматривается как правильный ответ, вот как я преобразовал base 62 <=> 10 в PHP, хотя есть много способов сделать это. http://ken -soft.com /? Р = 544

Я также объяснил, почему я написал это в качестве ответа в комментарии ниже (хотя я согласен, что это было слишком кратко) :) Извините.
Редактировать Почему это отклоняется? То, что я сказал, правда!

0 голосов
/ 29 июля 2010

Если у вас есть функция int digit60to10(char digit), которая преобразует [0-9a-zA-Z] в эквивалентное десятичное значение для одной цифры, вы можете сделать это:

int decimalValue = 0;
foreach digit in digits (most to least significant):
  decimalValue *= 60;
  decimalValue += digit60to10(digit);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...