我试图解析数据包以获得目的IP地址并将其转换为主机名。问题是我得到了一个负的目标地址,像这样:
- IP版本:4
- 头长度:20
- 总长度:60
- 协议:6
- 源IP: 10.0.2.0
- 目标IP: -83. 4.102.16 <
- 未知主机/gh>
- IP版本:4
- 头长度:20
- 总长度:92
- 协议:6
- 源IP: -64. 88.1.5
- 目标IP: 54. -9. -67. -15
int buffer = packet.get();
int version;
int headerlength;
version = buffer >> 4;
headerlength = buffer & 0x0F;
headerlength *= 4;
Log.d(TAG, "IP Version:"+version);
Log.d(TAG, "Header Length:"+headerlength);
String status = "";
status += "Header Length:"+headerlength;
buffer = packet.get(); //DSCP + EN
buffer = packet.getChar(); //Total Length
Log.d(TAG, "Total Length:"+buffer);
buffer = packet.getChar(); //Identification
buffer = packet.getChar(); //Flags + Fragment Offset
buffer = packet.get(); //Time to Live
buffer = packet.get(); //Protocol
Log.d(TAG, "Protocol:"+buffer);
status += " Protocol:"+buffer;
buffer = packet.getChar(); //Header checksum
String sourceIP = "";
buffer = packet.get(); //Source IP 1st Octet
sourceIP += buffer;
sourceIP += ".";
buffer = packet.get(); //Source IP 2nd Octet
sourceIP += buffer;
sourceIP += ".";
buffer = packet.get(); //Source IP 3rd Octet
sourceIP += buffer;
sourceIP += ".";
buffer = packet.get(); //Source IP 4th Octet
sourceIP += buffer;
Log.d(TAG, "Source IP:"+sourceIP);
status += " Source IP:"+sourceIP;
String destIP = "";
buffer = packet.get(); //Destination IP 1st Octet
destIP += buffer;
destIP += ".";
buffer = packet.get(); //Destination IP 2nd Octet
destIP += buffer;
destIP += ".";
buffer = packet.get(); //Destination IP 3rd Octet
destIP += buffer;
destIP += ".";
buffer = packet.get(); //Destination IP 4th Octet
destIP += buffer;
Log.d(TAG, "Destination IP:" + destIP);
status += " Destination IP:"+destIP;
try {
InetAddress addr = InetAddress.getByName(destIP);
String host = addr.getHostName();
Log.d(TAG, "Hostname:" + host);
}
catch (UnknownHostException e) {
Log.d(TAG,"Unknown host");
}
我做错了什么吗?我该怎么做才对呢?
packet.get()
返回byte
。在java中,byte
是有符号的,但是您期望一个无符号值。使用byte
,您可以获得任何字节的负值,应该大于127
例子
byte b = 0xFF; // 255
System.out.println(b == -1); // prints true
"convert"将byte
转换为正确的无符号值,您必须使用使用超过1字节的原始整型,并使用一些小技巧来获得无符号值:
byte b = // your value goes here
int printInt = ((int) b) & 0xFF;
// printInt contains the unsigned value of the byte.