为了账号安全,请及时绑定邮箱和手机立即绑定

Java BigInteger 加法看起来不对

Java BigInteger 加法看起来不对

浮云间 2021-10-28 09:49:14
我有两个字节数组,我试图添加使用BigInteger n1=new BigInteger(byte[] a1);BigInteger n2=new BigInteger(byte[] a2);BigInteger sum=a1.add(a2);byte[] as=sum.toByteArray();这是我得到的:a1=4A4A3E502602CE0C3D1792D5A2C6BADFE701E5C668FBE1D92F19923CD2A5143Ba2=FFE735AE9FB702A6C08D3ED57CB6CCF7CBB74F6F8D3F820A837A9775AF953F0Das=4A3173FEC5B9D0B2FDA4D1AB1F7D87D7B2B93535F63B63E3B29429B2823A5348查看最高有效字节,0x4A 和 0xFF 相加会生成丢失的进位。我希望添加两个 32 字节的整数会产生一个 33 字节的整数(这种情况是因为有进位)。
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

你确定你的字节数组的内容a1和a2?


BigInteger b1 = new BigInteger("4A4A3E502602CE0C3D1792D5A2C6BADFE701E5C668FBE1D92F19923CD2A5143B", 16);

BigInteger b2 = new BigInteger("FFE735AE9FB702A6C08D3ED57CB6CCF7CBB74F6F8D3F820A837A9775AF953F0D", 16);

BigInteger c = b1.add(b2);

System.out.println(c.toString(16));

产生:


4a4a3e502602ce0c3d1792d5a2c6badfe701e5c668fbe1d92f19923cd2a5143b

ffe735ae9fb702a6c08d3ed57cb6ccf7cbb74f6f8d3f820a837a9775af953f0d

14a3173fec5b9d0b2fda4d1ab1f7d87d7b2b93535f63b63e3b29429b2823a5348

随着预期的进行。


查看完整回答
反对 回复 2021-10-28
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

BigInteger 已签名。


仅考虑最高有效字节:


0x4A + 0xFF = 74 + -1 = 73 = 0x49 + 1 (carry from previous byte) = 0x4A

为了快速解决这个问题,我在两个数组中都添加了一个最重要的零。


004A4A3E502602CE0C3D1792D5A2C6BADFE701E5C668FBE1D92F19923CD2A5143B

00FFE735AE9FB702A6C08D3ED57CB6CCF7CBB74F6F8D3F820A837A9775AF953F0D

014A3173FEC5B9D0B2FDA4D1AB1F7D87D7B2B93535F63B63E3B29429B2823A5348


查看完整回答
反对 回复 2021-10-28
  • 2 回答
  • 0 关注
  • 194 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信