我尝试使用 Base64 将 BigInteger 转换为字符串并检查可逆性:
这个案例工作正常:
- 检查A1:
“999999999”
=>“O5rJ/w==”
- 检查 B1:
"O5rJ/w=="
=>"999999999"
但是这个案例没有:
- 检查 B2:
"//////"
=>"4294967295"
- 检查 A2:
"4294967295"
=>"/////w"
而不是"//////"
我正在使用 Java 8 和 org.apache.commons.codec.binary.Base64
@Test
public void testDecimalToBase64()
{
final String encodedMaxDec = new String(Base64.encodeInteger(new BigInteger("999999999")), StandardCharsets.UTF_8);
Assert.assertEquals("Check A1", "O5rJ/w==", encodedMaxDec);
final String encodedMaxB64 = new String(Base64.encodeInteger(new BigInteger("4294967295")), StandardCharsets.UTF_8);
Assert.assertEquals("Check A2", "//////", encodedMaxB64);
}
@Test
public void testBase64ToDecimal()
{
final BigInteger decodedMaxDec = Base64.decodeInteger(new String("O5rJ/w==").getBytes(StandardCharsets.UTF_8));
Assert.assertEquals("Check B1", "999999999", decodedMaxDec.toString());
final BigInteger decodedMaxB64 = Base64.decodeInteger(new String("//////").getBytes(StandardCharsets.UTF_8));
Assert.assertEquals("Check B2", "4294967295", decodedMaxB64.toString());
}
如果有人有想法,谢谢你帮助我;-)
最佳答案
在表示 4294967295
时,BitInteger
字节的 Base64 编码不是 //////
。
我假设,因为 Java 中的每个整数都经过签名,所以 BigInteger
在前面附加一个额外的字节来指示该数字是正数还是负数。
因此这段代码...
byte[] bigIntegerBytes = BigInteger.valueOf(4294967295l).toByteArray();
.. 返回一个 5 字节数组,并且您有以下字节:
000000000 11111111 11111111 11111111 1111111
如果你进行base64编码,你会得到AP////8=
如果您想要做的是对表示4294967295
的BigInteger
进行base64编码,然后再次将其解码回来,这应该可以做到。
Base64.Encoder encoder = Base64.getEncoder();
Base64.Decoder decoder = Base64.getDecoder();
byte[] bigIntegerBytes = BigInteger.valueOf(4294967295l).toByteArray();
String base64EncodedBigIntegerBytes = encoder.encodeToString(bigIntegerBytes);
System.out.println(base64EncodedBigIntegerBytes);
byte[] decodedBigIntegerBytes = decoder.decode(base64EncodedBigIntegerBytes);
BigInteger decodedBigInteger = new BigInteger(decodedBigIntegerBytes);
System.out.println(decodedBigInteger);
关于java - 使用 Base64 将 BigInteger 转换为 String 并反转结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52723402/