Ir ao conteúdo
  • Cadastre-se

Calculo de Endereço IP em Binário


Ir à solução Resolvido por Midori,

Posts recomendados

Boa tarde pessoal.

 

Estou desenvolvendo em C, um código onde recebe de entrada o endereço de IP e a máscara de rede.

Preciso retornar, o IP em binário, a máscara de rede em binário, o endereço de rede, broadcast e wildcard.

 

Até o momento, estou transformando em binário sem problemas.

Porém, não consigo fazer com que apareca o binário na ordem correta ao usuario.

Necessito da ordem para calcular o endereço de rede, broadcast e wildcard.

 

Agradeço desde já todas as ajudas.

 

Obrigado !!

 

;)

binario.txt

Link para o comentário
Compartilhar em outros sites

Você pode criar uma string para ir armazenando os bits da direita para a esquerda, ou seja do penúltimo char da string até o primeiro.

Segue o meu código, veja se ajuda.

    int byte[3], i, b;    char ip_binario[27] = "", *s = ip_binario;        printf("Endereco (xxx.xxx.xxx): ");    scanf("%d.%d.%d", &byte[0], &byte[1], &byte[2]);        s += 25;            for(b = 2; b >= 0; b--){        i = 8;        while(i--){                        *s-- = !(byte[b] % 2) ? '0' : '1';                        byte[b] /= 2;                    }        if( *s-- = '.';    }    printf("Endereco na forma binaria: %s\n", ++s);    return 0;
Link para o comentário
Compartilhar em outros sites

  • Solução

Para facilitar, tirei o ponteiro e uso apenas vetor

    int byte[3], b, i, x = 25;    char ip_binario[27] = "";        printf("Endereco (xxx.xxx.xxx): ");    scanf("%d.%d.%d", &byte[0], &byte[1], &byte[2]);    for(b = 2; b >= 0; b--){        i = 8;        while(i--){                     ip_binario[x--] = (byte[b] % 2) ? '1' : '0';                        byte[b] /= 2;                    }        if( ip_binario[x--] = '.';    }    printf("%s\n", ip_binario);    return 0;
Link para o comentário
Compartilhar em outros sites

Olliver, estou precisando de mais uma ajuda, se possível.

Estou tentando calcular o endereco de rede, que se da pelo binario do IP x (vezes) o binario da mascara de rede.

 

Estou utilizando o for que fica na linha 97 para isso.

Mas, na hora de exibir o resultado, não obtive sucesso.

 

Link : https://www.sendspace.com/file/lzp4pn

 

Obrigado !

Link para o comentário
Compartilhar em outros sites

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main()

{

    int byte[4], b, i, x = 34;

    int bytes[4], c, o, z = 34;

    int ipdecimal[4];

    char mascara_binario[36] = "";

    char ip_binario[36] = "";

    char wildcard[36] = "";

    char enderecoderede[36] = "";

    int op, d, cont, pot;

    do

    {

        printf("\n\nSeja bem vindo ao conversor de IP decimal para binario !");

        printf("\n1. Para digitar o IP e a Mascara de Rede");

        printf("\n2. Sair");

        printf("\nUsuario, por favor, digite a sua opcao: ");

        scanf("%d", &op);

        switch(op)

        {

        case 1:

            printf("\nDigite o endereco do seu IP: (XXX.XXX.XXX.XXX) ");

            scanf("%d.%d.%d.%d",&byte[0], &byte[1], &byte[2], &byte[3]);

            ipdecimal[0]=byte[0];

            ipdecimal[1]=byte[1];

            ipdecimal[2]=byte[2];

            ipdecimal[3]=byte[3];

            printf("\nDigite o endereco da sua Mascara de Rede: (XXX.XXX.XXX.XXX) ");

            scanf("%d.%d.%d.%d",&bytes[0], &bytes[1], &bytes[2], &bytes[3]);

            for(b = 3; b >= 0; b--) //calculo da rede em binario

            {

                i = 8;

                while(i--)

                {

                    ip_binario[x--] = (byte % 2) ? '1' : '0';

                    byte /= 2;

                }

                if( B) ip_binario[x--] = '.';

            }

            for(c=3; c>= 0; c--) //calculo da mascara em binario

            {

                o = 8;

                while(o--)

                {

                    mascara_binario[z--] = (bytes[c] % 2) ? '1' : '0';

                    bytes[c] /= 2;

                }

                if© mascara_binario[z--] = '.';

            }

            for(d=0 ; d<36 ; d++) //popularizando o vetor wildcard com o valor da mascara de rede

            {

                wildcard[d]=mascara_binario[d];

            }

            for(d=0 ; d<36 ; d++) //calculando o wildcard (negação da mascara)

            {

                if(wildcard[d] == '1')

                {

                    wildcard[d] = '0';

                }

                else

                {

                    if(wildcard[d] == '0')

                    {

                        wildcard[d] = '1';

                    }

                }

            }

            cont=0;

            pot=0;

            for(d=28 ; d<=36 ; d++) //contador

            {

                if(wildcard[d] == '1')

                {

                    cont++;

                }

            }

            pot = pow(2, cont);

            pot = pot-1;

            /*

            for(d=0 ; d<36 ; d++){

                enderecoderede[d]=ip_binario[d]*mascara_binario[d];

            }

            */

            for(d=0 ; d<36 ; d++) // calculo de endereco de rede

            {

                if(ip_binario[d]==mascara_binario[d])

                {

                    enderecoderede[d]=ip_binario[d];

                }

                else

                {

                    enderecoderede[d]='0';

                }

            }

            printf("O seu ip em binario e: %s\n", ip_binario);

            printf("A sua mascara em binario e: %s\n", mascara_binario);

            printf("O seu wildcard e: %s\n", wildcard);

            printf("O seu broadcast e: %d.%d.%d.%d\n", ipdecimal[0], ipdecimal[1], ipdecimal[2], pot);

            printf("O seu endereco de rede e: %s\n", enderecoderede);

            printf("%d %d", pot, cont);

        }

    }

    while(op!=2);

}

 

 

 

Fiz usando uma comparação, pois multiplicando para descobrir o endereço de rede não deu certo.

Olliver, porque utilizamos o "?" e "/="?

 

Linha 52/53?

 

Abraços !

Link para o comentário
Compartilhar em outros sites

Na multiplicação você está tentando efetuar a operação com char

enderecoderede[d]=ip_binario[d]*mascara_binario[d];
Você precisa converter para inteiro antes, para isso pode subtrair pelo char '0' e depois somar '0' para converter para char novamente:

enderecoderede[d] = ((ip_binario[d] - '0') * (mascara_binario[d] - '0')) + '0';
Quanto ao '?', se trata de um operador ternário ?: É tipo um if-else

Por exemplo, na linha abaixo atribuo 1 a y, caso x seja maior que 10. Caso contrário o valor atribuido sera 0.

y = x > 10 ? 1 : 0;
Quanto ao /=, é a forma resumida de divir, por exemplo

x = x / 2

é o mesmo que

x /= 2

Link para o comentário
Compartilhar em outros sites

  • 3 anos depois...

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!