我有一个长度为13的字符串,由字母组成(大写+小写都是可能的,但目前只使用UpperCase)和整数(0-9)(例如: BWOOL0JDXUNP1),我希望在不丢失任何数据的情况下将其长度减少到6-10个字符。我尝试使用StandardCharsets.UTF_8将其转换为字节,然后使用new BigInteger(1, bytes).toString(36)将其转换为字节,但它将长度增加到18个字符。我不知道这是否可能。如果有任何方法在Java中做到这一点,请帮助。
发布于 2022-03-09 12:28:03
假设字符串代表基数36 [0-9A-Z]中的一个数字,则可以通过将其转换为基62 [0-9A-Za-z]来“压缩”它,但是,这对缩小大小没有太大帮助,只有一个符号被“保存”:
String str = "BWOOL0JDXUNP1";
BigInteger bi = new BigInteger(str, 36);
String alpha = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
BigInteger size = BigInteger.valueOf(alpha.length());
System.out.println(str);
StringBuilder sb = new StringBuilder();
while (bi.compareTo(BigInteger.ZERO) > 0) {
int cp = bi.mod(size).intValue();
sb.append(alpha.charAt(cp));
bi = bi.divide(size);
}
System.out.println(sb);
// -> BWOOL0JDXUNP1
// -> NXew7nv28E51另外,二进制压缩可以使用一些自定义编码,例如,上述62个字符[0-9A-Za-z]仅适合6位,因此上述12个字符可以用12 * 0.75 =9字节表示。当然,在这种情况下,需要额外的“解包装”方法来正确地表示结果。
https://stackoverflow.com/questions/71407548
复制相似问题