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

1

Я пытаюсь разобрать пакет, чтобы получить IP-адрес назначения и преобразовать его в имя хоста. Проблема в том, что я получаю отрицательный адрес назначения, например:

  • Версия 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 & 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");
    }

Я делаю что-то неправильно? И как я должен делать это правильно?

  • 0
    Какой тип возвращаемого packet.get() ?
  • 0
    Он используется для получения байта текущей позиции байтового буфера и увеличивает их позицию на 1. Ссылка -> ссылка
Теги:
packet
tcp
ip

1 ответ

3
Лучший ответ

packet.get() возвращает byte. В java- byte подписывается, но вы ожидаете значения без знака. Используя byte вы получаете отрицательные значения для любого байта, который должен быть больше 127

пример

byte b = 0xFF; // 255
System.out.println(b == -1); // prints true

Чтобы "преобразовать" byte в правильное значение без знака, вы должны использовать примитивный интегральный тип, который использует более 1 байт, и сделать небольшой трюк, чтобы получить значение unsigned:

byte b = // your value goes here
int printInt = ((int) b) & 0xFF;
// printInt contains the unsigned value of the byte.
  • 0
    Спасибо! Это помогло. Действительно ценю этого человека! :) PS Нужно ли сделать эту тему "Решена" или что-то?
  • 0
    @CikLinas: Чтобы пометить вопрос как решенный, вы обычно принимаете ответ. ( см. Справочный центр )

Ещё вопросы

Сообщество Overcoder
Наверх
Меню