#java #tcp #ip #packet
#java #tcp #ip #пакет
Вопрос:
Я пытаюсь проанализировать пакет, чтобы получить IP-адрес назначения и преобразовать его в hostname. Проблема в том, что я получаю отрицательный адрес назначения, вот так:
- Версия IP: 4
- Длина заголовка: 20
- Общая длина: 60
- Протокол: 6
- Исходный IP: 10.0.2.0
- IP-адрес назначения:-83.-4.102.16
- Неизвестный хост
- Версия 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 amp; 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");
}
Я делаю что-то не так? И как я должен это сделать правильно?
Комментарии:
1. Какой тип возвращаемого
packet.get()
?2. Он используется для получения байта текущей позиции bytebuffer и увеличивает их позицию на 1. Ссылка -> link
Ответ №1:
packet.get()
ВОЗВРАТ byte
. В Java byte
подписано, однако вы ожидаете значение без знака. Используя byte
, вы получаете отрицательные значения для любого байта, который должен быть больше, чем 127
Пример
byte b = 0xFF; // 255
System.out.println(b == -1); // prints true
Чтобы «преобразовать» byte
в правильное значение без знака, вы должны использовать примитивный интегральный тип, который использует более 1 байта, и проделать небольшую хитрость, чтобы получить значение без знака:
byte b = // your value goes here
int printInt = ((int) b) amp; 0xFF;
// printInt contains the unsigned value of the byte.
Комментарии:
1. Спасибо! Это помогло. Действительно ценю этого человека! 🙂 P.S Нужно ли мне сделать этот поток «решаемым» или что-то в этомроде?