«Нужно, чтобы метод toHex(String) был реализован согласно условию»
Не могу понять, в чём дело. Все три проверки в методе есть:
на null, на пустую строку, на недопустимые символы.
На тестовых данных проверил.
package com.javarush.task.pro.task09.task0908;
import java.util.regex.Pattern;
/*
Двоично-шестнадцатеричный конвертер
*/
public class Solution {
public static void main(String[] args) {
String binaryNumber = "100111010000";
System.out.println("Двоичное число " + binaryNumber + " равно шестнадцатеричному числу " + toHex(binaryNumber));
String hexNumber = "9d0";
System.out.println("Шестнадцатеричное число " + hexNumber + " равно двоичному числу " + toBinary(hexNumber));
}
public static String toHex(String binaryNumber) {
//сначала проверка, что строка непустая и в ней только нули и единицы
String result = "";
if (binaryNumber == null) {
return "";
} else if (binaryNumber.isEmpty()) {
return "";
} else {
boolean check_format = true;
int len = binaryNumber.length();
for (int i = 0; i < len; i++) {
if ((binaryNumber.charAt(i) != '1') & (binaryNumber.charAt(i) != '0')) {
check_format = false;
}
}
if (check_format) {
//теперь добавляем нули к строке слева, чтобы количество делилось на 4
String temp_binaryNumber = binaryNumber;//создаю копию строки, куда буду добавлять нули, если нужно
switch (len % 4) {
case 1:
temp_binaryNumber = "0" + binaryNumber;
break;
case 2:
temp_binaryNumber = "00" + binaryNumber;
break;
case 3:
temp_binaryNumber = "000" + binaryNumber;
break;
}
//теперь беру подстроки по 4 символа и перевожу их в 16-ричные символы
String nextHex = ""; //здесь куски по 4 бита
char nextHexDigit = 0;//здесь цифры в 16-ричной системе
int i = 0;
while (i < temp_binaryNumber.length()) {
nextHex = temp_binaryNumber.substring(i, i + 4);
switch (nextHex) {
case "0000":
nextHexDigit = '0';
break;
case "0001":
nextHexDigit = '1';
break;
case "0010":
nextHexDigit = '2';
break;
case "0011":
nextHexDigit = '3';
break;
case "0100":
nextHexDigit = '4';
break;
case "0101":
nextHexDigit = '5';
break;
case "0110":
nextHexDigit = '6';
break;
case "0111":
nextHexDigit = '7';
break;
case "1000":
nextHexDigit = '8';
break;
case "1001":
nextHexDigit = '9';
break;
case "1010":
nextHexDigit = 'a';
break;
case "1011":
nextHexDigit = 'b';
break;
case "1100":
nextHexDigit = 'c';
break;
case "1101":
nextHexDigit = 'd';
break;
case "1110":
nextHexDigit = 'e';
break;
case "1111":
nextHexDigit = 'f';
break;
}
result = result + nextHexDigit;
i = i + 4;
}
}
else {
return "";
}
}
return result;
}
public static String toBinary(String hexNumber) {
String result = "";//заготовка для строки-результата
//сначала проверка на пустой аргумент
if (hexNumber == null) {
return "";
} else if (hexNumber.isEmpty()) {
return "";
} else {
String HEX_SYMBOLS = "0123456789abcdef";
boolean check_digits = true;
for (int i = 0; i < hexNumber.length(); i++) {
if (HEX_SYMBOLS.indexOf(hexNumber.charAt(i)) == -1) {
check_digits = false;
}
}
if (check_digits) {
char nextHexDigit = 0;
String nextBinSeq = "";
int i = 0;
while (i < hexNumber.length()) {
nextHexDigit = hexNumber.charAt(i);
switch (nextHexDigit) {
case '0':
nextBinSeq = "0000";
break;
case '1':
nextBinSeq = "0001";
break;
case '2':
nextBinSeq = "0010";
break;
case '3':
nextBinSeq = "0011";
break;
case '4':
nextBinSeq = "0100";
break;
case '5':
nextBinSeq = "0101";
break;
case '6':
nextBinSeq = "0110";
break;
case '7':
nextBinSeq = "0111";
break;
case '8':
nextBinSeq = "1000";
break;
case '9':
nextBinSeq = "1001";
break;
case 'a':
nextBinSeq = "1010";
break;
case 'b':
nextBinSeq = "1011";
break;
case 'c':
nextBinSeq = "1100";
break;
case 'd':
nextBinSeq = "1101";
break;
case 'e':
nextBinSeq = "1110";
break;
case 'f':
nextBinSeq = "1111";
break;
}
result = result + nextBinSeq;
i = i + 1;
}
}
else {
return "";
}
}
return result;
}
}