Измените двоичную строку на целое через каждые два символа разделения - PullRequest
0 голосов
/ 25 октября 2018
String startingp="1000000100001110010100";

 String start =java.util.Arrays.toString(startingp.split("(?<=\\G..)"));
 start = start.replaceAll("\\p{P}","").trim(); //trim coz of the bracket
 int foo=Integer.parseInt(start, 2);
 System.out.println("Splitstart:" + start);

Мне нужно разделить каждые две цифры startp, являющегося двоичной строкой: пример 11 00 01, а также изменить их на целочисленное значение.Но я получаю ошибку как результат.Не забудьте объяснить, что не так с кодом

Исключение в потоке "main" java.lang.NumberFormatException: Для входной строки: "10 00 00 01 00 00 11 10 01 0100 "в java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) в java.lang.Integer.parseInt (Integer.java:580)

Ответы [ 5 ]

0 голосов
/ 25 октября 2018

Ваша проблема в этой строке;

int foo=Integer.parseInt(start, 2);

Поскольку здесь start param равно 10 00 00 01 00 00 11 10 01 01 00.Если вы проанализируете функцию parseInt, вы увидите, что сравнение в этой строке будет на меньше , чем 2 для всех символов string,Таким образом, в вашем параметре некоторый space, это не действительный .

Чтобы решить эту проблему, разделите пробелом, чтобы получить все две комбинации в строке.Сделай это так;

String startingp = "1000000100001110010100";
String start = java.util.Arrays.toString(startingp.split("(?<=\\G..)"));
start = start.replaceAll("\\p{P}", "").trim(); //trim coz of the bracket
final String[] splittedStart = start.split("\\s+"); // parse with blank 
Arrays.stream(splittedStart).forEach(s -> System.out.println("Split start: " + Integer.parseInt(s, 2))); // to print.
0 голосов
/ 25 октября 2018

С простой старой Java:

    List<Integer> intNums = new ArrayList<>();
    String startingp="1000000100001110010100";
    for(int i=0; i<startingp.length() - 2; i+=2){
        String strNum = startingp.substring(i,i+2);
        Integer intNum = Integer.parseInt(strNum);
        intNums.add(intNum);
    }
    System.out.println(intNums);
0 голосов
/ 25 октября 2018

Я думаю, вам нужно что-то вроде этого:

String startingp = "1000000100001110010100";
List<Integer> result = Arrays.stream(startingp.split("(?<=\\G..)"))
                .map(s -> Integer.parseInt(s, 2)) // parse each string in the array
                .collect(Collectors.toList());    // collect the result in the end

Выходы

[2, 0, 0, 1, 0, 0, 3, 2, 1, 1, 0]

Где каждое int эквивалентно одному из:

[10, 00, 00, 01, 00, 00, 11, 10, 01, 01, 00]
  2   0   0   1   0   0   3   2   1   1   0
0 голосов
/ 25 октября 2018

Чтобы проанализировать каждые 2 символа до их десятичного представления, вам нужно снова разбить строку на пробелы и проанализировать каждые 2 символа.Так что вам нужен цикл for:

ArrayList<String> convertedToDecimal = new ArrayList<>();
for(String twoChars: start.split(" ")){
    convertedToDecimal.add(String.valueOf(Integer.parseInt(start, 2)));
}

Этот ArrayList может быть присоединен для создания нужной строки с String.join("", convertedToDecimal.toArray(new String[convertedDecimal.size()]))

0 голосов
/ 25 октября 2018

Сообщение довольно ясно: "10 00 00 01 00 00 11 10 01 01 00" не является строкой, которую parseInt может проанализировать с помощью int.

Неясно, почему вы хотите сначала разделить цифры на пары.Просто проанализируйте startingp напрямую:

String startingp="1000000100001110010100";
int foo=Integer.parseInt(startingp, 2);

Ideone demo

Если вы хотите проанализировать пары в целых, вам нужно применять его к каждому элементу по очереди:

System.out.println(
    Arrays.stream(startingp.split("(?<=\\G..)"))
        .map(p -> Integer.valueOf(p, 2))
        .map(Object::toString));
    .collect(joining(" "))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...