Во-первых, используйте BigInteger.toByteArray
, что бы вы ни делали с .toString
и .getBytes
не будет работать.
Во-вторых, BigInteger.toByteArray
вернет байтовый массив в два дополнения. Поскольку ваше число больше 2 ^ 31, оно займет 5 байтов, а не 4. См. Java BigInteger.toByteArray docs . Или посмотрите вывод System.out.println(x.length);
.
Итак, вам нужно:
import java.math.BigInteger;
class BigIntegerTest {
public static void main(final String[] argv) {
BigInteger bx=new BigInteger("3806908688");
byte x[]=new byte[5];
x=bx.toByteArray();
System.out.println(x.length);
long l=0;
int i=0;
l |= x[i] & 0xFF;
l <<= 8;
l |= x[i+1] & 0xFF;
l <<= 8;
l |= x[i+2] & 0xFF;
l <<= 8;
l |= x[i+3] & 0xFF;
l <<= 8;
l |= x[i+4] & 0xFF;
System.out.println(l);
}
}
что дает:
5
3806908688
Обратите внимание, что я использую long
, а не int
, чтобы убедиться, что значение соответствует типу.
Вам также лучше использовать цикл for:
long l = 0;
for (int i = 0; i < x.length; ++i) {
l <<= 8;
l |= x[i] & 0xFF;
}
System.out.println(l);
Таким образом, вам не нужно точно знать длину массива. Хотя я все еще буду осторожен, чтобы понять, что это в дополнение к двум - кто знает, когда вы можете случайно использовать минус числа или что-то подобное.