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.

Преобразование в строку в любой системе счисления использует BigInteger.toString(основание счисления).

Для синтаксического анализа используйте новый BigInteger(String s, целое основание).

person OldCurmudgeon    schedule 12.09.2014