NumberFormatException в резултат на преобразуване на Java

Целта е да конвертирате низ в int в java.

Моите декларации:

String [] dataIn = new String[100];
int [] binVals = new int[100];
int i;
String toBinary;

Първо конвертирам шестнадесетичен низ в двоичен низ.

static String hexToBin(String s) {
        return new BigInteger(s,16).toString(2);
    }
.....
.....
toBinary = hexToBin(dataIn[i]);

try{
    int temp = Integer.parseInt(toBinary); 
    binVals[i] = temp;
    System.out.println(temp);
} catch (NumberFormatException ex){
    System.out.println("Not gonna work");
}

toBinary е стойност на низ от 32 бита, т.е. 00011100...01 Отпечатах резултата на конзолата, за да се уверя, че е валиден за целочислено преобразуване. И все пак използването на Integer.parseInt(toBinary); все още хвърля изключението. Какво ми липсва тук?

Актуализирано

Според това, което казахте, сега вече не получавам изключение, но когато преобразувам двоичния низ в цяло число, изглежда, че става десетично цяло число.

if (i % 2 == 0)
{
toBinary = hexToBin(dataIn[i]); 
System.out.println("Binary in String: " + toBinary);
try{
    int temp = Integer.parseInt(toBinary, 2); 
    binVals[i] = temp;
    System.out.println("binVals[i] in int" + binVals[i]);
} catch (NumberFormatException ex){
    System.out.println("Not gonna work");
}
    //System.out.println(temp);
} else {
    System.out.println("This should be a timestamp: " + dataIn[i]);
}

Изход:

Binary in String: 1001010101010101010101010100000
binVals[i] in int1252698784
This should be a timestamp: 2068a40

person KS7X    schedule 12.09.2014    source източник
comment
Integer.parseInt(toBinary, 2); отново да има същото цяло число. Въпреки че, ако знаковият бит е зададен (отрицателно число), наистина е по-добре да използвате (int)Long.parseLong(..., 2).   -  person Joop Eggen    schedule 12.09.2014


Отговори (3)


Проблемът е, че Integer.parseInt без основа ще интерпретира низа като десетично число, а не като двоично. Повечето такива "двоични" низове ще представляват числа, които са над максималното възможно цяло число, малко над 2 милиарда, напр. 111 000 101 010 001.

Предайте в радикс от 2 (двоичен) към Integer.parseInt:

int temp = Integer.parseInt(toBinary, 2);

Въпреки това, ако първият "бит" е зададен, тогава представеното число ще бъде над Integer.MAX_VALUE и тогава само Long.parseLong ще работи.

person rgettman    schedule 12.09.2014
comment
Благодаря, изключението го няма. Въпреки че се появи друг проблем, актуализирах въпроса - person KS7X; 12.09.2014
comment
Числото в int не е в никакъв формат. Само когато println го преобразува в String, се създава десетично представяне - 1252698784. Опитвате ли се да го конвертирате обратно в шестнадесетичен като част от вашия тест? - person rgettman; 12.09.2014
comment
Бих искал да го запазя като двоично число - person KS7X; 12.09.2014
comment
Използвайте Integer.toString(int, int), предавайки основа от 2 като втори аргумент, за да го преобразувате в низ, който е двоично представяне на числото. - person rgettman; 12.09.2014
comment
Добре, моето разбиране е, че ако искам двоично представяне, то трябва да остане като низ, както вече направих, а не като цяло число? - person KS7X; 12.09.2014
comment
За да покажете която и да е числова стойност, трябва да я преобразувате в String, независимо дали го правите имплицитно или изрично. С Integer.toString(int, int) вие изрично избирате как искате вашето int да бъде представено като String. - person rgettman; 12.09.2014
comment
Разбрах. Отговорихте на първоначалния ми въпрос и разрешихте объркването ми. Благодаря! - person KS7X; 12.09.2014

Опитайте Integer.parseInt(toBinary, 2);. 2 указва, че низът е двоичен (база 2)

Редактиране: за новия ви проблем проблемът е, че Java по подразбиране ще отпечата цели числа като десетични, така че трябва да превърнете вашето (десетично) цяло число обратно в двоичен низ. Можете да използвате Integer.toBinaryString(int i) за това.

person Nekojimi    schedule 12.09.2014
comment
Благодаря, това помогна. Актуализирах въпроса, тъй като цялото число вече не е в двоичен формат - person KS7X; 12.09.2014

За анализиране и форматиране на цели числа трябва да обмислите използването на BigInteger.

Преобразуването в String във всяка основа използва BigInteger.toString(int radix).

За синтактичен анализ използвайте ново BigInteger(String s, int radix).

person OldCurmudgeon    schedule 12.09.2014