В данном задании мне требуется взять строковое двоичное и перевести его в строковое шестнадцатеричное. И обратно.
Также, сделать 3 проверки вводных данных.
1) на нулл
2) на числа отличные от 0 или 1 в двоичном
3) на символы и числа отличные от 0-9 и a-f нижнего регистра.
Собственно так как в предыдущих заданиях мы уже переводили 2 в 10 и 10 в 16. И обратно.
Я решил данный вопрос создав промежуточный шаг на перевод. Система работает, всё переводит. Исправно возвращает пустые строки при вводе любых ошибочных чисел в дано.
Но отец валидатор завернул в бараний рог КАЖДЫЙ пункт проверки)
Переписывать особого смысла не вижу. прекрасно программа работает не криво не косо на мой взгляд.
Хочу услышать критику кода от профессионалов.
package com.javarush.task.pro.task09.task0908;
import java.util.regex.Pattern;
/*
Двоично-шестнадцатеричный конвертер
*/
public class Solution {
private static final String HEX = "0123456789abcdef";//трафарет хекса
public static char toMethod = '0'; // Чар класса чтобы его можно было с 1-го метода в другой перезагнать
public static void main(String[] args) {
String binaryNumber = "100111010000110110011111";
int decimalFromBinaryNumber = toDecimalFromBinary(binaryNumber);//присваиваю переменной результат работы метода 2 в 10
System.out.println("Двоичное число " + binaryNumber + " равно шестнадцатеричному числу " + toHex(decimalFromBinaryNumber));
String hexNumber = "9d0d9f";
int decimalFromHexNumber = toDecimalFromHex(hexNumber);// Присваиваю переменной резутьтат перевода 16 в 10
System.out.println("Шестнадцатеричное число " + hexNumber + " равно двоичному числу " + toBinary(decimalFromHexNumber));
}
public static int toDecimalFromBinary(String binaryNumber) {//шаг 1 перевожу 2 в 10
if (binaryNumber == null) {
return 0;
}
//////////////////////////
int decimalFinal = 0;
int stringLength = binaryNumber.length();
boolean numCorrect = false;
//Проверяет каждый символ. Если символ = 0 или 1 то булеан тру.
//если условие не выполнено то булеан не тру и тогда прерви цикл проверки.
for (int i = 0; i < stringLength ; i++) {
if (binaryNumber.charAt(i) == '0' || binaryNumber.charAt(i) == '1') {
numCorrect = true;
} else {
numCorrect = false;
break;
}
}
///////////////////////////
if(numCorrect)// если все проверки пройдены то переведи мне 2 в 10 и верни 10.
for (int i = stringLength; i > 0; i--) {
char x = binaryNumber.charAt(i - 1);
int y = Character.getNumericValue(x);
decimalFinal = decimalFinal + (y * (int) (Math.pow(2,stringLength - i)));
}
return decimalFinal;//вернул 10
}
public static String toHex(int decimalNumber) {//шаг 2 перевожу 10 в 16
String sixteenFigureFinal = "";
int leftAfterDecimalDivide = 0;
/////////////////////////
while (decimalNumber > 0) {
leftAfterDecimalDivide = decimalNumber - (decimalNumber/16)*16;
char x = HEX.charAt(leftAfterDecimalDivide);
String y = Character.toString(x);
sixteenFigureFinal = y + sixteenFigureFinal;
decimalNumber = decimalNumber / 16;
}
return sixteenFigureFinal;//вернул 16
}
//////////////////////////////////////////////////////////////////////
//Граница. Ниже перевод 16 в 2
/////////////////////////////////////////////////////////////////////
public static int toDecimalFromHex(String hexNumber) {//шаг 1 перевожу 16 в 10
if (hexNumber == null) {
return 0;
}
int decimalCalculated = 0;
int stringLength = hexNumber.length();
int hexLength = HEX.length();
char checkIfMatch = ' ';
int count = 0;
boolean isTrue = false;
/////////////////////////
//проверяю если символы хекса совпадают с трафаретом хекса
for (int i = 0; i < stringLength ; i++) {//беру символы данного хекса присваиваю их checkIfMatch
checkIfMatch = hexNumber.charAt(i);
for (int j = 0; j < hexLength; j++) {//сравиниваю checkIfMatch с трафаретом хекса
if (checkIfMatch == HEX.charAt(j)) {
count = count + 1;// Если совпало то каунт +1. Если нет то - ничего.
}
}
}
/////////////////////////
if (count == stringLength ) { // сравниваю итого каунта с длинной строки
isTrue = true;
}
/////////////////////////
if (isTrue)// если каунт совпал с длинной строки значит все символы подходят таблице хекса
for (int i = 0; i < stringLength ; i++) {
toMethod = hexNumber.charAt(i);
decimalCalculated = (16 * decimalCalculated) + charToIndex(HEX);
}
/////////////////////////
return decimalCalculated;
}
public static int charToIndex(String HEX) {//создаю инт ранвый индексу конвертируемого символа в HEX'е
int stringLength = HEX.length();
int p = 0;
////////////////////////////
for (int i = 0; i < stringLength; i++) {
if (toMethod == HEX.charAt(i)) {
p = i;
break;
}
}
return p;
}
public static String toBinary(int decimalNumber) {//шаг 2 - перевожу 10 в 2
String binaryOutlook = "";
int divideRest = 0;
/////////////////////////////
while (decimalNumber > 0) {
divideRest = decimalNumber - (decimalNumber / 2) * 2;
binaryOutlook = (divideRest + binaryOutlook);
decimalNumber = decimalNumber / 2;
}
return binaryOutlook;
}
}