我想做的是将一个字符串从一种“字母表”转换为另一种,就像在不同进制之间转换数字一样,但更抽象且具有任意数字。
例如,将来自字母表“0123456789”的“255”转换为字母表“0123456789ABCDEF”将得到“FF”。一种方法是将输入字符串转换为整数,然后再转换回来。如下所示:(伪代码)
int decode(string input, string alphabet) {
int value = 0;
for(i = 0; i < input.length; i++) {
int index = alphabet.indexOf(input[i]);
value += index * pow(alphabet.length, input.length - i - 1);
}
return value;
}
string encode(int value, string alphabet) {
string encoded = "";
while(value > 0) {
int index = value % alphabet.length;
encoded = alphabet[index] + encoded;
value = floor(value / alphabet.length);
}
return encoded;
}
这样,decode("255", "0123456789")
返回整数255,encode(255, "0123456789ABCDEF")
返回"FF"
。
这对于小字母表有效,但我想使用基础26(所有大写字母)或基础52(大写和小写)或基础62(大写,小写和数字),以及可能超过一百位数的值。理论上,上面的算法可以用于这样的字母表,但实际上,当您开始执行62 ^ 100时,数字变得如此之大,因此会遇到整数溢出问题。
我想知道是否有一种算法可以进行这样的转换,而不必跟踪如此巨大的整数?也许有一种方法可以在整个输入字符串被处理之前开始输出结果?
我的直觉告诉我这可能是可能的,但我的数学技能不足。任何帮助都将不胜感激。
这里有几个类似的问题,但没有一个完全符合我的要求。