Почему я получаю отрицательный адрес назначения из пакета

#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 Нужно ли мне сделать этот поток «решаемым» или что-то в этомроде?