首页 > 解决方案 > 使用 Base64 将 BigInteger 转换为 String 并反转结果

问题描述

我尝试使用 Base64 将 BigInteger 转换为字符串并检查可逆性:

这种情况下工作正常:

但这种情况不会:

我正在使用 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());

}

如果有人有想法,谢谢你帮助我;-)

标签: javabase64

解决方案


BitInteger表示时 a 字节的 base64 编码4294967295不是//////

我假设因为 Java 中的每个整数都经过签名,所以会BigInteger在前面附加一个字节来指示数字是正数还是负数。

因此这段代码...

byte[] bigIntegerBytes = BigInteger.valueOf(4294967295l).toByteArray();

.. 返回一个 5 字节数组,您有以下字节:

000000000 11111111 11111111 11111111 1111111

如果你base64编码你得到AP////8=

如果您想要做的是 base64 编码一个BigInteger表示4294967295然后再次将其解码,那么应该这样做。

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);

推荐阅读