2016-11-23 4 views
0

J'ai donc fait cette chose comme ceci:Comment convertir une adresse en un masque de réseau (décimal)

for(i=1;i<=MASK;i++) // MASK IS THE ADDRESS 
{ 
    MASKBINARY[i]=1; // CREATE AN ARRAY WITH 1s and 0s 
} 
for(i=8;i>0;i--) 
{ 

    if(MASKBINARY[i-1]==1 && MASKBINARY[i]==0) // check if the next element is 1 
    { 
     k=i-1; // get the position to the first 1 
     numar1=numar1 + powl(10,i-1); 
    } 
    if(MASKBINARY[i]==1 && i!=(8-k)) // check if your element is 1 and different from the first 1 
    { 
     numar1=numar1 + powl(10,8-i); 
    } 

} 
printf("\n %d",numar1); 
for(i=16;i>8;i--) 
{ 

    if(MASKBINARY[i-1]==1 && MASKBINARY[i]==0 && numar1!=11111111) 
    { 
     k=i-9; 
     numar2=numar2 + powl(10,17-i); 
    } 
    if(MASKBINARY[i]==1 && i!=k+8) 
    { 
     numar2=numar2 + powl(10,16-i); 
    } 

} 
printf("\n %d",numar2); 
for(i=24;i>16;i--) 
{ 

    if(MASKBINARY[i-1]==1 && MASKBINARY[i]==0 && numar2!=11111111) 
    { 
     k=i-17; 
     numar3=numar3 + powl(10,25-i); 
    } 
    if(MASKBINARY[i]==1 && i!=k+16) 
    { 
     numar3=numar3 + powl(10,24-i); 
    } 

} 
printf("\n %d",numar3); 
for(i=32;i>24;i--) 
{ 

    if(MASKBINARY[i-1]==1 && MASKBINARY[i]==0 && numar3!=11111111) 
    { 
     k=i-25; 
     numar4=numar4 + powl(10,33-i); 
    } 
    if(MASKBINARY[i]==1 && i!=k+24) 
    { 
     numar4=numar4 + powl(10,32-i); 
    } 

} 

En fait ce que je ne vous prends l'adresse (disons que c'est 4) et je crée un tableau avec 1s et 0s (fait un masque de masque de réseau). Puis j'ai converti ce tableau en 4 variables (numar1,2,3,4) que j'ai transformées en base 10 (à partir de 2). Donc, si mon adresse est 4, la sortie sera 240.0.0.0, exactement comme ici: https://www.iplocation.net/subnet-mask Le problème est que ce code est un vrai désordre et très inefficace. Comment puis-je transformer efficacement cette adresse en un masque de réseau (décimal)? Puis-je travailler d'une manière ou d'une autre avec les bits? Quelque chose comme, prendre les 8 premiers bits, les convertir en base 10, prendre les 8 bits suivants les convertir, prendre la prochaine ... etc? Ou je ne sais pas, quelque chose qui est pas ... mauvais

Je suis un noob, je sais que c'est un gâchis

+2

A part: je n'ai pas de réponse mais prenez l'habitude de placer le 'newline' à la * fin * de chaque expression' printf', pas au début. Ce que vous avez n'est pas idiomatique et vous induira en erreur lors de l'impression de repères de débogage. –

+0

quelque chose comme 'htonl()' ou 'htons()' serait-il utile? – KevinDTimm

+0

Vos boucles semblent ne pas savoir que les tableaux dans C sont indexés entre '0' et' LEN-1' bien que vous ne nous ayez pas donné les définitions de tableau. –

Répondre

0

En utilisant une boucle et certains opérateurs au niveau du bit:

int mask = 0; 
int addr; // get this from the user or something 
for (int i = 0; i < addr; i++) { 
    mask = mask >> 1; // move bits to the right 
    mask = mask | 0x80000000; // hexadecimal notation, set the 31st bit 
} 

Maintenant, le masque est un entier (32 bits) avec un nombre de bits approprié. Maintenant, convertir en décimal est facile. Par exemple:

int fourth = mask & 0xff; // take the rightmost byte 
int third = (mask >> 8) & 0xff; // move to the right by one byte, take the new rightmost byte 
int second = (mask >> 16) & 0xff; // move by two bytes 
int first = (mask >> 24) & 0xff; 

Maintenant, le masque est first.second.third.fourth

Hope this il éclaircit, prendre regarder les opérateurs de niveau du bit et essayer d'envelopper votre tête autour d'eux :)

+0

Donc si mon addr = 4, ça va ajouter 4 1s au début du masque et le | 0x80000000 va créer un entier 32 bits comme 11110000.00000000.00000000.00000000? – Dafuq

+0

Ouais, d'abord il définit le 31ème bit en utilisant bitwise-ou (mask = mask | 0x80000000), puis à l'itération suivante de la boucle il déplace tous les bits vers la droite (mask = mask >> 1) alors seulement le 30 le bit est défini. Après cela, le bit numéro 31 est à nouveau défini (les bits 31 et 30 sont donc définis). Vous devez juste vous assurer que le type int peut contenir 32 bits (4 octets), peut-être inclure stdint.h et utiliser uint32_t – Razbit