BigInteger.toByteArray () возвращает странное значение в Java - PullRequest
2 голосов
/ 19 марта 2012

Я экспериментирую с BigIntegers со случайными значениями.

BigInteger bi1 = new BigInteger("365375409332725729550921208179070754913983135742");
BigInteger bi2 = new BigInteger("386718480727050819604290866521372728863001258687");

byte[] bytesBi1 = bi1.toByteArray();
byte[] bytesBi2 = bi2.toByteArray();

Первый - тот, который производит странное значение.Второй в порядке.

Может кто-нибудь объяснить мне, что я делаю неправильно?

Редактировать

Вот результаты:

bytesBi1 = [63, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2]
bytesBi2 = [67, -67, 14, 113, -94, 16, -120, 82, 84, 95, -127, -124, -90, -33, 29, -102, 90, 125, -86, -65]

Ответы [ 3 ]

1 голос
/ 19 марта 2012

BigInteger метод toByteArray() возвращает представление числа с добавлением к двум * .

Полученные значения на самом деле являются правильным представлением чисел с добавлением к двум.Вы вставили.

0 голосов
/ 19 марта 2012

Это шестнадцатеричное внутреннее представление bi1, вы можете увидеть его в отладчике

mag[0] = 3FFFFFFF 
mag[1] = FFFFFFFF 
mag[2] = FFFFFFFF 
mag[3] = FFFFFFFF 
mag[4] = 00000001 

Если вы разбиваете каждый меч на 4 байта и берете дополнение два из каждого байта
вы получаете свои цифры.

например, для первой строки: mag[0] = 3F,FF,FF,FF, который превращается в 63, -1 ,-1,-1 в десятичной записи

Так что ничего плохого в вашем выводе.

0 голосов
/ 19 марта 2012

Я проверил данное число с моей собственной реализацией чисел произвольной точности.Значения байтов являются полностью правильными, поэтому может быть просто случай, когда генератор случайных чисел облажался, имеет плохое качество, или вы получили какой-то необычный выброс.

...