Программа работает корректно, но валидатор не пропускает по второму условию "Нужно, чтобы метод toBinary(String) был реализован согласно условию".
Перечитала все вопросы в разделе "Помощь" и вроде бы все комментарии к ним учла - сделала проверку на правильность символов во входной строке; если количество бит на выходе не кратно 4, дополнила слева нулями.
Прогнала по разным значениям - перевод в двоичную систему происходит правильно, но валидатор так не считает. Я уже всю голову сломала, отыскивая причину... Вся надежда на специалистов сообщества. Подскажите, пожалуйста, что не так! Буду очень благодарна!
package com.javarush.task.pro.task09.task0908;
import java.util.regex.Pattern;
import java.util.Arrays;
/*
Двоично-шестнадцатеричный конвертер
*/
public class Solution {
private static final String HEX = "0123456789abcdef";
public static void main(String[] args) {
String binaryNumber = "100000010000";
System.out.println("Двоичное число " + binaryNumber + " равно шестнадцатеричному числу " + toHex(binaryNumber));
String hexNumber = "12";
System.out.println("Шестнадцатеричное число " + hexNumber + " равно двоичному числу " + toBinary(hexNumber));
}
public static String toHex(String binaryNumber) {
String res = "";
if (binaryNumber == null || binaryNumber.equals("")) { //проверка на пустую строку и null
return "";
}
String regex = "[0-1]+"; //проверка на наличие символов кроме 0 и 1
if (binaryNumber.matches(regex) == false) {
return "";
}
if (binaryNumber.length() % 4 != 0) { //дополняем нулями, если надо
int a = 4 - binaryNumber.length() % 4;
for (int i = 0; i < a; i++) {
binaryNumber = "0" + binaryNumber;
}
}
char[] chArray = binaryNumber.toCharArray();
for (int i = 0; i < chArray.length / 4; i++) { //берем по 4 бита
char[] newArray = Arrays.copyOfRange(chArray, i + 3*i, (i + 3*i) + 4);
String binStr = String.valueOf(newArray);
int decimalNumber = 0;
for (int j = 0; j < binStr.length(); j++) {//переводим каждые 4 бита в десятичное представление
int index = binStr.length() - 1 - j;
int value = Character.getNumericValue(binStr.charAt(index));
decimalNumber = (int) (decimalNumber + value * Math.pow(2, j));
}
if (decimalNumber == 0) { //если 10ое число = 0, выводим 0
char sym = HEX.charAt(0);
res = res + sym;
}
while (decimalNumber != 0) {//переводим 10ое число в 16ое
char sym = HEX.charAt(decimalNumber % 16);
res = res + sym;
decimalNumber = decimalNumber / 16;
}
}
return res;
}
public static String toBinary(String hexNumber) { // Вот этот метод почему-то не принимает валидатор
if (hexNumber == null || hexNumber.equals("")) {//проверка на пустую строку и null
return "";
}
String regex = "[0-9a-f]+";
if (hexNumber.matches(regex) == false) {//проверка на наличие правильных символов
return "";
}
int dec = 0;
for (int i = 0; i < hexNumber.length(); i++) {//переводим из 16ого в 10ое
char s = hexNumber.charAt(i);
int b = HEX.indexOf(s);
dec = (int) (16 * dec + b);
}
String bin = "";
if (dec == 0) {//если число = 0, выводим 0000; если = 00, выводим 00000000, и т.д.
for (int i = 0; i < hexNumber.length(); i++) {
bin = "0000" + bin;
}
}
while (dec != 0) {//переводим из 10ого в 2ое
bin = (dec % 2) + bin;
dec = dec / 2;
}
if (bin.length() % 4 != 0) {//добавляем нули слева, если надо
int a = 4 - bin.length() % 4;
for (int i = 0; i < a; i++) {
bin = "0" + bin;
}
}
return bin;
}
}