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

标签 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());

}

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

最佳答案

在表示 4294967295 时,BitInteger 字节的 Base64 编码不是 //////

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

因此这段代码...

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

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

000000000 11111111 11111111 11111111 1111111

如果你进行base64编码,你会得到AP////8=

如果您想要做的是对表示4294967295BigInteger进行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/

相关文章:

java - 如何读取 Elasticsearch 快照

java - 仅在完成帐户注册后才跳过 Activity

DDB 中复合范围键的 Java 注释

二进制文件的 Python 3 和 base64 编码

php - Base 64 编码与加载图像文件

java - 自定义 Grails 异常处理

java - Android开发,关于Java SDK和32/64位版本的一些问题

python-3.x - 如果使用 python 计算,JWT hs512 签名与 jwt.io 略有不同

ios - 将图像路径数组转换为base64编码的字符串。?

java - 在 Java 中将文件编码为 Base64