Operação AND com o IP

Eu preciso fazer um programa em Java que o usuário entre com o IP e o programa informa caso esse IP seja de rede ou de host.
Utiliza-se a operação AND para tal, entretanto eu não sei como fazê-la.

Bom Dia,

Isso está com cara de exercício de faculdade/curso técnico.

Poste ai o que vc já tem e suas dúvidas mais especificamente, não “alguém pode fazer o exercício pra mim?”

Att

boa, sherlock. ;D

eu comecei nesse post aqui http://www.guj.com.br/java/259377-calcular-o-range-de-ips#1353002

basicamente, se é de rede está na mesma máscara de subrede que seu computador. Ou seja, se seu computador tem ip 192.168.0.1 e a máscara é 255.255.255.0 você tem que verificar se está no intervalo 192.168.0.1 e 192.168.0.255. Lembrando que máscara de subrede pode ser, por exemplo, 255.255.128.0

vou ser mais claro. o que eu quero é o seguinte.
ex: o usuario entre com o IP(host) 172.28.235.202 mascara 255.255.254.0
O calculo do range de IP deve ser feito apartir do endereco de rede, nesse caso: 172.28.234.0.

Então alguma ideia de como fazer a operação AND no java para identificar o endereco de rede?

Converta o IP em um número, converta a máscara em outro número, e então faça o AND desses dois números.
Lembre sempre que é mais fácil entender as operações intermediárias se você converter para hexadecimal ou binário (não sei o que você acha mais fácil entender). Por exemplo, o IP 192.168.0.1 é o número hexadecimal 0xC0A80001.

existe algum outro meio além do hexadecimal?

Eu só falei “hexadecimal” porque achei que você saberia entender melhor com esse método. Não é preciso passar para hexadecimal ou binário, exceto para lhe ajudar a entender por que é que usa o AND ou o OR para checar se um determinado endereço está dentro de uma máscara.

o que deve ser feito então?

entendi, então o que você quer é o endereço de broadcast da subrede?

Fiz esse código rapidinho, vê se te soluciona:

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package testeip;

/**
*

  • @author Everton
    */
    public class TesteIP {

    /**

    • @param args the command line arguments
      */
      public static void main(String[] args) {
      String ip = “172.28.235.202”;
      String mask = “255.255.255.0”;

      short[] ipB = new short[4];
      short[] maskB = new short[4];

      int cont = 0;
      for(String ipS : ip.split("\.")){
      System.out.println("Range IP: "+ipS);
      ipB[cont++] = (new Short(ipS)).shortValue();
      }
      cont = 0;

      for(String maskS : mask.split("\.")){
      System.out.println("Range IP Mask: "+maskS);
      maskB[cont++] = (new Short(maskS)).shortValue();
      }

      System.out.print(“Start Range IP: “);
      for(cont=0;cont<4;cont++){
      System.out.print((ipB[cont]&maskB[cont])+”.”);

      }

    }
    }
    [/code]

Converta o IP para um número (como foi feito naquele post que você citou). Converta a máscara em um número (da mesma maneira). Efetue o AND desses dois números. Você deve ter aprendido no seu curso de redes o que representa o resultado desse AND. A seguir, pegue esse número, e converta de volta para um IP (nesse post também tem a resposta).

Dá uma olhada nessa lógica:

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package testeip;

/**
*

  • @author Everton
    */
    public class TesteIP {

    /**

    • @param args the command line arguments
      */
      public static void main(String[] args) {
      String ip = “172.28.129.202”;
      String mask = “255.255.33.0”;

      short[] ipB = new short[4];
      short[] maskB = new short[4];

      int cont = 0;
      for(String ipS : ip.split("\.")){
      System.out.println("Range IP: "+ipS);
      ipB[cont++] = (new Short(ipS)).shortValue();
      }
      cont = 0;

      for(String maskS : mask.split("\.")){
      System.out.println("Range IP Mask: "+maskS);
      maskB[cont++] = (new Short(maskS)).shortValue();
      }

      System.out.print(“Start Range IP: “);
      for(cont=0;cont<4;cont++){
      System.out.print((ipB[cont]&maskB[cont])+”.”);

      }
      System.out.print(“Start Range IP: “);
      for(cont=0;cont<4;cont++){
      System.out.print(((maskB[cont])*(1+ipB[cont])/(1+maskB[cont]))+”.”);

      }

    }
    }
    [/code]

Vê se isso te dá uma luz…

[quote=entanglement]Converta o IP para um número (como foi feito naquele post que você citou). Converta a máscara em um número (da mesma maneira). Efetue o AND desses dois números. Você deve ter aprendido no seu curso de redes o que representa o resultado desse AND. A seguir, pegue esse número, e converta de volta para um IP (nesse post também tem a resposta).
[/quote]

180 * (256^3) +48 * (256^2) + 10 * 256 + 0 = 3023047168

o mesmo com a mascara
255 * (256^3) + 255 * (256^2) + 192*256 + 0 = 4294950912

e agora?

Dica: o “AND” é o operador “&”

pra mim ficou claro como a noite rsrs

dá uma olhada no código que te mandei para ver se clareia.

e agora?

[quote=evefuji]Dá uma olhada nessa lógica:

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package testeip;

/**
*

  • @author Everton
    */
    public class TesteIP {

    /**

    • @param args the command line arguments
      */
      public static void main(String[] args) {
      String ip = “172.28.129.202”;
      String mask = “255.255.33.0”;

      short[] ipB = new short[4];
      short[] maskB = new short[4];

      int cont = 0;
      for(String ipS : ip.split("\.")){
      System.out.println("Range IP: "+ipS);
      ipB[cont++] = (new Short(ipS)).shortValue();
      }
      cont = 0;

      for(String maskS : mask.split("\.")){
      System.out.println("Range IP Mask: "+maskS);
      maskB[cont++] = (new Short(maskS)).shortValue();
      }

      System.out.print(“Start Range IP: “);
      for(cont=0;cont<4;cont++){
      System.out.print((ipB[cont]&maskB[cont])+”.”);

      }
      System.out.print(“Start Range IP: “);
      for(cont=0;cont<4;cont++){
      System.out.print(((maskB[cont])*(1+ipB[cont])/(1+maskB[cont]))+”.”);

      }

    }
    }
    [/code]

Vê se isso te dá uma luz…[/quote]

sim, eu já vi. por sinal está incorreto.

eu fiz um teste com o ip = “172.28.235.202”;
e a mascara = “255.255.254.0”;

apareceu o seguinte:
Start Range IP: 172.28.234.0.Start Range IP: 172.28.235.0

o certo seria
172.28.234.1 (até)-> 172.28.235.254
ou

172.28.234.0 (até)-> 172.28.235.255

sim sim, foi lógica rápida, feita em poucos minutos, vê o que precisa mudar na lógica para dar certo. Te mostrei alguns recursos.

sinceramente, não entendo praticamente nada do código.