在不丢失数据的情况下缩短字符串的长度



我有一个长度为13的字符串,由字母表(大写+小写都可以,但目前只使用uppercase(和整数(0-9((例如:BWOOL0JDXUNP1(组成,我想在不丢失任何数据的情况下将其长度减少到6-10个字符。我尝试过使用StandardCharsets.UTF_8new BigInteger(1, bytes).toString(36)将其转换为字节,但它将长度增加到了18个字符。我不确定这是否可能。如果有任何方法可以在Java中做到这一点,请提供帮助。

假设字符串表示一个以36[0-9A-Z]为基数的数字,它可能是"压缩的";另外,通过转换到基62[0-9A-Za-z],然而,这对减小大小没有太大帮助,只有1个符号是"1";保存":

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个字节来表示。当然,在这种情况下;拆包";方法才能正确地表示结果。

相关内容

  • 没有找到相关文章

最新更新