【发布时间】:2020-06-26 19:58:12
【问题描述】:
我正在做以下编程练习: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 转换为 string,二进制没有填充零:
ip: 0
binary: 0
如何将长 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)
我已阅读:
【问题讨论】:
-
int32 是
int而不是long。
标签: java string casting binary long-integer