Ir ao conteúdo
  • Cadastre-se
Gabriel Fernandes_712485

RESOLVIDO Calculo de Endereço IP em Binário

Recommended Posts

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

Compartilhar este post


Link para o post
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;

Compartilhar este post


Link para o post
Compartilhar em outros sites

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;

Compartilhar este post


Link para o post
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 !

Compartilhar este post


Link para o post
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 !

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde! 

Estou desenvolvendo em C, um código onde recebe de entrada do endereço de IP.

Preciso pegar a sequencia de bits do IP e retornar o endereço IP? 

Agradeço desde já todas as ajudas.

 

Obrigada !!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×