[英]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.