我一直在努力减少路的长度.我代表程序中的一些整数ID.例如
2
3
15
26
63
...
151564852
我希望它们能够被表示为(仅限0-9A-Za-z)
2
3
F
Q
z
...
vDF25a //For example
我想到的方法是有63个if语句,每个映射分别从0-63到0-z,对于64以上的任何映射,在值减去63时进行递归.
毋庸置疑,我认为我的做法非常缺陷且不切实际.这样做更合适的方法是什么?
更新:
根据fge的建议,我已经让编码器正常工作,但是我的解码功能仅适用于最长2个字符串,在字符串较大的情况下,总和会变得错误.例如,对于3840到3845,这是输出
// Encoded
zw
x
zy
zz
100
// Decoded
3840
3841
3842
3843
124 //Invalid decoding
这是我的解码功能代码
public static int decode(String value)
{
String revStr = new StringBuilder(value).reverse().toString();
int sum = 0;
for (int i=1; i < revStr.length(); i++)
{
for (int j=0; j < ALPHABET.length; j++)
{
if (ALPHABET[j] == revStr.charAt(i))
{
sum += (ALPHABET.length * j) * i;
break;
}
}
}
for (int j=0; j < ALPHABET.length; j++)
{
if (ALPHABET[j] == revStr.charAt(0))
{
sum += j;
break;
}
}
return sum;
}
解决方法:
这不是base64; base64编码二进制数据.
无论如何,你不需要加载if语句;使用数组:
public final class AlphabetEncoder
{
private static final char[] ALPHABET = { '0', '1', '2', ...., 'z' };
private static final int ENCODE_LENGTH = ALPHABET.length;
public static String encode(int victim)
{
final List<Character> list = new ArrayList<>();
do {
list.add(ALPHABET[victim % ENCODE_LENGTH]);
victim /= ENCODE_LENGTH;
} while (victim > 0);
Collections.reverse(list);
return new String(list.toArray(new char[list.size()],
StandardCharsets.UTF_8);
}
public int decode(final String encoded)
{
int ret = 0;
char c;
for (int index = 0; index < encoded.length(); index++) {
c = encoded.charAt(index);
ret *= ENCODE_LENGTH;
ret += Arrays.binarySearch(ALPHABET, c);
}
return ret;
}
}
关于解码功能的注释:这里可以使用Arrays.binarySearch(),因为字母表具有自然排序的良好属性(0 <1 <2 <... 相关文章 转载注明原文:如何将整数转换为base64(0-9A-Za-z) - 代码日志
点击查看更多相关文章