使用Java中的一组固定字母将long编码/解码为字符串

Chr*_*oom 4 java string encoding decoding character-encoding

给定一组任意字母

String range = "0123456789abcdefghijklmnopABCD#";
Run Code Online (Sandbox Code Playgroud)

我正在寻找2种方法来编码/解码长< - >字符串

String s = encode( range, l );
Run Code Online (Sandbox Code Playgroud)

long l = decode( range, s );
Run Code Online (Sandbox Code Playgroud)

所以 decode(range, encode(range, 123456789L)) == 123456789L

如果范围是"0123456789",这是通常的编码方式.

pol*_*nts 13

以下代码可满足您的需求:

static long decode(String s, String symbols) {
    final int B = symbols.length();
    long num = 0;
    for (char ch : s.toCharArray()) {
        num *= B;
        num += symbols.indexOf(ch);
    }
    return num;
}
static String encode(long num, String symbols) {
    final int B = symbols.length();
    StringBuilder sb = new StringBuilder();
    while (num != 0) {
        sb.append(symbols.charAt((int) (num % B)));
        num /= B;
    }
    return sb.reverse().toString();
}
public static void main(String[] args) {
    String range = "0123456789abcdefghijklmnopABCD#";
    System.out.println(decode(encode(123456789L, range), range));
    // prints "123456789"

    System.out.println(encode(255L, "0123456789ABCDEF"));
    // prints "FF"

    System.out.println(decode("100", "01234567"));
    // prints "64"
}
Run Code Online (Sandbox Code Playgroud)

请注意,这实际上是使用自定义符号集进行基本转换.

相关问题