Я выполняю следующее упражнение по программированию: int32 to IPv4 . Это утверждение:
Примите следующий адрес IPv4: 128.32.10.1
Этот адрес имеет 4 октета, где каждый октет представляет собой один байт (или 8 бит).
1st octet 128 has the binary representation: 10000000
2nd octet 32 has the binary representation: 00100000
3rd octet 10 has the binary representation: 00001010
4th octet 1 has the binary representation: 00000001
Итак 128.32.10.1 == 10000000.00100000.00001010.00000001
Поскольку указанный IP-адрес имеет 32 бита, мы можем представить его как 32-разрядное число без знака: 2149583361
Завершить функцию он принимает 32-разрядное число без знака и возвращает строковое представление своего адреса IPv4. Примеры
2149583361 ==> "128.32.10.1" 32 ==> "0.0.0.32" 0 ==> "0.0.0.0"
Сначала я попробовал следующий код :
public class Kata {
public static String longToIP(long ip) {
System.out.println("ip: "+ip);
String binary = Long.toBinaryString(ip);
System.out.println("binary: "+binary);
return String.format("%s.%s.%s.%s",Long.parseLong(binary.substring(0,8),2),Long.parseLong(binary.substring(8,16),2),
Long.parseLong(binary.substring(16,24),2),Long.parseLong(binary.substring(24),2));
}
}
И будучи тестами:
import org.junit.Test;
import java.util.Random;
import static org.junit.Assert.assertEquals;
public class KataTest {
@Test
public void sampleTest() {
assertEquals("128.114.17.104", Kata.longToIP(2154959208L));
assertEquals("0.0.0.0", Kata.longToIP(0));
assertEquals("128.32.10.1", Kata.longToIP(2149583361L));
}
}
Когда ввод равен нулю, мой код выдает исключение: java.lang.StringIndexOutOfBoundsException: begin 0, end 8, length 1
at Kata.longToIP(Kata.java:6)
Из-за строки 4, где я конвертирую из long в строку, двоичный файл не имеет нулевых полей:
ip: 0
binary: 0
Как я могу преобразовать значение long ip в двоичную строку с всегда 32 цифрами (с добавлением отступа 0)?
Я попробовал следующий подход:
public class Kata {
public static String longToIP(long ip) {
System.out.println("ip: "+ip);
String binary = String.format("%032d",Long.parseLong(Long.toBinaryString(ip)));
System.out.println("binary: "+binary);
return String.format("%s.%s.%s.%s",Long.parseLong(binary.substring(0,8),2),Long.parseLong(binary.substring(8,16),2),
Long.parseLong(binary.substring(16,24),2),Long.parseLong(binary.substring(24),2));
}
}
И он выдает java.lang.NumberFormatException: For input string: "10000000011100100001000101101000" at Kata.longToIP(Kata.java:4)
Затем я изменил его на:
public class Kata {
public static String longToIP(long ip) {
System.out.println("ip: "+ip);
String binary = String.format("%032d",Long.parseLong(Long.toBinaryString(ip),2));
System.out.println("binary: "+binary);
return String.format("%s.%s.%s.%s",Long.parseLong(binary.substring(0,8),2),Long.parseLong(binary.substring(8,16),2),
Long.parseLong(binary.substring(16,24),2),Long.parseLong(binary.substring(24),2));
}
}
И это также вызывает исключение:
java.lang.NumberFormatException: For input string: "00000021"
at Kata.longToIP(Kata.java:7)
Я прочитал: