我正在执行以下编程练习: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)
我读过:
我们可以添加填充零:
public class Kata {
public static String longToIP(long ip) {
System.out.println("ip: "+ip);
String binary = Long.toBinaryString(ip);
if(binary.length()<32) binary = "0".repeat(32-binary.length()) + binary;
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));
}
}
或者,我们可以在同一句子中使用格式将长字符串转换为二进制字符串:
public class Kata {
public static String longToIP(long ip) {
System.out.println("ip: "+ip);
String binary = String.format("%32s",Long.toBinaryString(ip)).replace(' ','0');
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));
}
}