使用 Base64 将 BigInteger 转换为 String 并反转结果

Ind*_*ent 3 java base64

我尝试使用 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());

}
Run Code Online (Sandbox Code Playgroud)

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

Cpt*_*ger 7

BitIntegera的字节在表示4294967295not时采用 Base64 编码//////

我假设,因为 Java 中的每个整数都有符号,所以BigInteger前面会附加一个字节来指示该数字是正数还是负数。

因此这段代码...

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

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

000000000 11111111 11111111 11111111 1111111

如果你对你得到的进行base64编码AP////8=

如果您想要做的是对BigInteger表示进行 Base64 编码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);
Run Code Online (Sandbox Code Playgroud)