java - 使用 Base64 将 BigInteger 转换为 String 并反转结果
问题描述
我尝试使用 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());
}
如果有人有想法,谢谢你帮助我;-)
解决方案
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);
推荐阅读
- css - 当用户在页面上处于活动状态时,如何继续显示链接元素的边框底部
- sql - SQL查询以获取在层次结构中较高的所有记录的列表
- networking - 如何在 ns-3 中使用具有模拟网络和节点的真实应用程序?
- html - 在 Angular 中将用于拖放的光标更改为 nonDragZone 或 DraggableZone
- twitter - 为什么我的 Twitter 链接不显示图片?
- javascript - javascript document.getElementById 仅从 php mysql 数据库中读取第一个值
- ios - 如何在 xcode 11.4 中更改模拟器设备?
- kubernetes - gcloud ingress https 重定向通过 helm 图表定义
- google-apps-script - 如何使用 App Scripts 从 Google Docs 中删除文本?
- javascript - Javascript for loop getElementsByName