有没有办法将38位数字转换为长度为18到20且没有任何特殊字符的字符串?

问题描述 投票:0回答:1

我有一个用例,我需要将 38 位数字编码为长度为 18 到 20 的字符串。

我在java中使用容量为16字节的

ByteBuffer
来存储两个Long值。然后我尝试将其编码为不带任何特殊字符的字符串。我尝试了 base32 编码,结果是长度为 26 的字符串,但我的用例需要一个更小的字符串。

有什么解决方法吗?

java string encoding character-encoding
1个回答
0
投票

要将 38 位数字编码为 18-20 个字符的字符串,您可以使用 Base62 编码,其中包括字母数字字符(0-9、A-Z、a-z),提供比 Base32 更紧凑的结果。

步骤: 将 38 位数字转换为 BigInteger(因为 Long 无法处理)。 使用 Base62 对 BigInteger 进行编码。 这是 Java 中的一个简短示例:

java 复制代码 导入 java.math.BigInteger;

公共类 Base62Encoder {

private static final String BASE62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
private static final int BASE = BASE62.length();

public static String encodeBase62(BigInteger number) {
    StringBuilder encoded = new StringBuilder();
    while (number.compareTo(BigInteger.ZERO) > 0) {
        encoded.append(BASE62.charAt(number.mod(BigInteger.valueOf(BASE)).intValue()));
        number = number.divide(BigInteger.valueOf(BASE));
    }
    return encoded.reverse().toString();
}

public static void main(String[] args) {
    BigInteger number = new BigInteger("12345678901234567890123456789012345678");
    String encodedString = encodeBase62(number);
    System.out.println("Encoded String: " + encodedString);
    System.out.println("Length: " + encodedString.length());
}

} 这将为您提供目标长度内的 Base62 编码字符串。

© www.soinside.com 2019 - 2024. All rights reserved.