Java BigInteger не выглядит правильно - PullRequest
0 голосов
/ 05 октября 2018

У меня есть два байтовых массива, которые я пытаюсь добавить, используя

BigInteger n1=new BigInteger(byte[] a1);
BigInteger n2=new BigInteger(byte[] a2);
BigInteger sum=a1.add(a2);
byte[] as=sum.toByteArray();

Вот что я получил:

a1=4A4A3E502602CE0C3D1792D5A2C6BADFE701E5C668FBE1D92F19923CD2A5143B
a2=FFE735AE9FB702A6C08D3ED57CB6CCF7CBB74F6F8D3F820A837A9775AF953F0D
as=4A3173FEC5B9D0B2FDA4D1AB1F7D87D7B2B93535F63B63E3B29429B2823A5348

Глядя на самый значимый байт, добавление 0x4Aи 0xFF генерирует потерянный перенос.Я ожидаю, что добавление двух 32-байтовых целых чисел приведет к 33-байтовому целому числу (в этом случае, поскольку есть перенос).

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

BigInteger подписан.

Учитывая только самый старший байт:

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

Чтобы быстро решить эту проблему, я добавил наиболее значимый ноль в обоих массивах.

004A4A3E502602CE0C3D1792D5A2C6BADFE701E5C668FBE1D92F19923CD2A5143B
00FFE735AE9FB702A6C08D3ED57CB6CCF7CBB74F6F8D3F820A837A9775AF953F0D
014A3173FEC5B9D0B2FDA4D1AB1F7D87D7B2B93535F63B63E3B29429B2823A5348
0 голосов
/ 05 октября 2018

Вы уверены в содержании ваших байтовых массивов 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

С ожидаемым переносом.

...