如何将整数转换为base64(0-9A-Za-z)

时间:2014-02-26 13:53:28

标签: java string character-encoding compression base64

我一直在努力减少路的长度。我代表程序中的一些整数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;
}

3 个答案:

答案 0 :(得分:4)

这不是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 <...

答案 1 :(得分:3)

根据您使用的语言,应该已经存在一个将字符串从/转换为base64的模块。 查看另一篇文章:Base64 Encoding in Java

答案 2 :(得分:3)

您可以参考现有的逻辑,将{Decor [0-9]转换为Integer类中存在的十六进制转换,并扩展Base 64 converison的逻辑。参考

Integer.toHexString(int i)

这可能是转换的有效实施。