在Java中将BigInteger转换为更短的字符串

7
我正在寻找一种将BigInteger转换为非常短的字符串(尽可能短)的方法。转换需要是可逆的。在这种情况下,转换的安全性不是很重要。是否有人可以推荐或提供解决此问题的示例?

8
“哈希”和“可逆”是不匹配的。哈希本质上是一种不可逆的设计!你可能在寻找的是压缩算法。 - Joachim Sauer
谢谢Joachin。我已经更新了问题,使其更加清晰。 - Dave Maple
2个回答

9
您可以使用Base64编码。请注意,此示例使用Apache commons-codec库:
BigInteger number = new BigInteger("4143222334431546643677890898767548679452");
System.out.println(number);

String encoded = new String(Base64.encodeBase64(number.toByteArray()));
System.out.println(encoded);

BigInteger decoded = new BigInteger(Base64.decodeBase64(encoded));
System.out.println(decoded);

打印:

4143222334431546643677890898767548679452
DC0DmJRYaAn2AVdEZMvmhRw=
4143222334431546643677890898767548679452

1
可以将末尾的“=”(或“==”)去掉,因为它只是填充,解码仍然有效。 - Luigi R. Viggiano

9

一种简单的方法是使用 BigInteger.toString(Character.MAX_RADIX)。要进行反转,请使用以下构造函数:BigInteger(String val, int radix)


整洁,我不知道 Character.MAX_RADIX - Bart Kiers
1
MAX_RADIX 是 36:从 0-9a-z。但是,如果你想仅使用字母数字字符,你也可以使用 Base64 或 Base62 来使用大写字符,这个类可以做到这一点:https://github.com/opencoinage/opencoinage/blob/master/src/java/org/opencoinage/util/Base62.java - Luigi R. Viggiano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接