gpt4 book ai didi

Java将IP+端口转换为长整型并返回

转载 作者:行者123 更新时间:2023-12-01 18:02:05 24 4
gpt4 key购买 nike

我正在尝试将 IP 地址和端口存储在 Long 中。我的下面的代码适用于值小于 255 的端口,但不适用于其他值。

import java.util.*;
import java.lang.*;
import java.io.*;

class Test {

public static void main(String[] args) {
String first = "192.168.1.2:84";
String second = "255.255.255.255:65535";

long ip1 = ipToLong(first);
System.out.println("iptoLong : " + ip1);

System.out.println("longToIp : " + longToIp(ip1));

System.out.println();

ip1 = ipToLong(second);
System.out.println("iptoLong : " + ip1);

System.out.println("longToIp : " + longToIp(ip1));

}

public static long ipToLong(String ipAddress) {
int port = Integer.parseInt(ipAddress.substring(ipAddress.indexOf(":") + 1, ipAddress.length()));
ipAddress = ipAddress.replace(":", "").replace(""+port, "");

String[] ip = ipAddress.split("\\.");

long result = 0;
result |= Long.parseLong(ip[0]) << 40;
result |= Long.parseLong(ip[1]) << 32;
result |= Long.parseLong(ip[2]) << 24;
result |= Long.parseLong(ip[3]) << 16;

result |= port << 8;
result |= port;

return result;
}

public static String longToIp(long i) {
long port = ((i >> 8) & 0xFF) | (i & 0xFF);

return ((i >> 40) & 0xFF) +
"." + ((i >> 32) & 0xFF) +
"." + ((i >> 24) & 0xFF) +
"." + ((i >> 16) & 0xFF) +
":" + port;

}
}

以下是该代码的输出:

iptoLong  : 211827803968596
longToIp : 192.168.1.2:84

iptoLong : 281474976710655
longToIp : 255.255.255.255:255

正如您在第二个示例中看到的,它打印 255 而不是 65535。

这里是代码片段的 ideone 链接:http://ideone.com/rWo7qJ

谢谢!

最佳答案

您对端口的编码和解码都错误。

对于您正在执行的编码:

result |= port << 8;
result |= port;

假设你的端口是0xfeff,你要做的是:

result |= 0xfeff00;
result |= 0x00feff;

(第一行)不会做任何有用的事情,并且会覆盖 IP 地址中的最低有效字节。但这并不是导致您出现问题的原因 - 您需要使用不同的数字(例如 1.2.3.4:65534)来查看该问题的实际情况。

你应该做的是:

result |= port & 0xFFFF;

(& 0xFFFF 部分是为了保护您的代码免受负数和数字 65535 的影响,否则它们会覆盖 IP#)

要解码,你要做的是:

long port  = ((i >> 8) & 0xFF) | (i & 0xFF);

现在假设 long 的最低 16 位包含 0xFFFF,那么您的代码会:

long port = ((0xFFFF >> 8) & 0xFF) | (0xFFF & 0xFF)
= 0xFF | 0xFF
= 0xFF;

相反,您期望的是0xFFFF。改为:

long port = (i & 0xFFFF);

关于Java将IP+端口转换为长整型并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40133853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com