Проблема с номером при сохранении в BigInteger и получении обратно - PullRequest
0 голосов
/ 05 августа 2011
BigInteger bx=new BigInteger("5888561920");

System.out.println("bx:"+bx);

byte x[]=new byte[5];

x=bx.toByteArray();

for(k=4;cnt<4;k--)
{

    cnt++;

    t[k-1]=x[k];
}

for(i=0;i<4;i++)

        System.out.print(" "+t[i]);

System.out.println("\nbig: "+toInt(t));

Выход для вышеуказанного кода:

bx:5888561920

 94 -4 83 0

big: 1593594624

Проблема здесь в том, что когда я преобразую большое целое число в байтовый массив и снова преобразовываю тот же байтовый массив в большое целое число, значения большого целого числа изменяются. Но когда я заменяю число «5888561920» на «2944280960» или «3806908688», нет проблем, я получаю тот же номер, что и вывод. В чем здесь проблема? Это проблема с BigInteger или "5888561920"

Я сам написал метод toInt:

public static BigInteger toInt(byte[] b){

     String st=new String();
    for(int k=3;k>=0;k--){
        for(int i=0;i<8;i++)
        {
            if ((b[k] & 0x01) == 1)
            {
                st="1"+st;
            }
            else
            {
                st="0"+st;
            }
            b[k]=  (byte) (b[k] >> 1);
        }
    }

    BigInteger bi=new BigInteger(st,2);

    return bi;
}

Ответы [ 2 ]

2 голосов
/ 05 августа 2011

В toInt () вы объединяете 32 младших значащих бита (k = 0..3 x i = 0..7) числа.

5888561920 больше 32-разрядного числа. На самом деле его двоичное представление (в соответствии с Windows Calc) - 101011110111111000101001100000000, длина которого составляет 33 бита. Вы урезали самый значимый бит.

2944280960 и 3806908688 соответствуют 32 битам (биты 33 и далее все равно будут равны нулю).

Итак, я думаю, вам нужен пятый байт, в конце концов:)

1 голос
/ 05 августа 2011

Нижние 4 байта 5888561920 (5888561920% 2 ^ 32) == 1593594624

Если вы хотите сохранить это число, вам нужно более 4 байтов.

...