задача решена, не без боя, но остался вопрос:
stringBuilder.append(Integer.toBinaryString(bytes[i] & 255 | 256).substring(1) + " ");
Подглядела метод перевода байтов в двоичный код, но не уверено, что поняла до конца.
1. Операция bytes[i] & 255 | 256 - это преобразование байтов в Integer? Как так происходит?
2. Далее преобразуем Integer в бинарный код, записанный в строке Integer.toBinaryString(bytes[i] & 255 | 256)
3. И далее обрезаем строку substring(1). 1 - это равнозначно 8 битам?
Подскажите, пожалуйста, кто хорошо разобрался с этим вопросом...
Polina
29 уровень
вопрос по методу print (преобразование байтов в бинарный код)
Обсуждается
Комментарии (2)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Filin Filin
27 января 2020, 22:27
Я думаю будет не лишним объясниться ...
Чтобы перевести обычное число в двоичный код , нужно это число делить на 2 и при каждом делении добавлять в строку остаток от деления , пока число больше 0 ...
Затем , нужно эту строку перевернуть и получим искомое бинарное значение числа ...
Но , так-как мы работаем с байтами ( размер не может быть больше 255 ) , то нам необходимо каждую строку дополнять недостающими нулями :
255 ==> 11111111
2 ==> 10
Ну , а в вычислениях inetAddress по совету экзаменатора применяем поразрядное И (&) к каждому байту ip и mask и результат записываем в bb ...
Может есть другие решения или встроенные в Java методы ...
Кто знает - поделитесь ...
0
Filin Filin
27 января 2020, 22:07
Добавьте в файл эти три метода , и валидатор Ваш ...
public static byte[] getNetAddress(byte[] ip, byte[] mask) {
byte[] bb=new byte[4];
for(int i=0;i<bb.length;i++){
bb[i]=(byte)((byte)ip[i]&(byte)mask[i]);
}
return bb;
}
public static void print(byte[] bytes) {
String t="";
for(byte b:bytes){
int c=b;
if((""+b).contains("-")){
c=256+b;
}
t+=toBin(c)+" ";
}
System.out.println(t);
}
public static String toBin(int x){
String t="";
while(x>0){
t+=x%2;
x/=2;
}
return reverse(t);
}
public static String reverse(String s){
char[] cc=s.toCharArray();
s="";
for(int i=cc.length-1;i>=0;i--){
s+=cc[i];
}
for(int i=s.length();i<8;i++){
s=0+s;
}
return s;
}
+4