java - 如何将 long 转换为其二进制 32 位表示?
问题描述
我正在做以下编程练习:int32 到 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)
我读过了:
解决方案
public class Kata {
public static String longToIP(long ip) {
//1. translate the ip to binary representation
String str = "";
if (ip == 0) {
str = ip + "";
} else {
while (ip != 0) {
str = ip % 2 + str;
ip = ip / 2;
}
}
//2. if the binary string is shorter than 32 bit, then add "0" in front
while (str.length() != 32) {
str = "0" + str;
}
String result = "";
//3. truncate the str to four items
for (int i = 0; i < 4; i++) {
String partStr = str.substring(i * 8, 8 * (i + 1));
//4. translate every item to decimal number
int bi = Integer.parseInt(partStr, 2);
if (i == 3) {
result += bi + "";
} else {
result += bi + ".";
}
}
return result;
}
}
推荐阅读
- amazon-ecs - 无法使用 docker hub 私有存储库映像注册 ecs 任务
- java - 如何在testng的单独java文件中使用@BeforeTest
- ios - 是否可以禁用应用程序中的其他应用程序
- html - 缩小到下拉菜单时的导航栏问题
- reactjs - 循环内组件的单个实例上的条件类
- mysql - 如何使用mysql重写器插件?
- javascript - 这个功能性的 Javascript 示例是如何工作的?
- amazon-web-services - AWS EC2 RHEL7 实例权限问题
- laravel - 是否有任何有效的方法来获取对象的 ID 到我的创建方法
- ios - 将文档的文档 ID 添加到其自己的 Firestore 文档 - Swift 4