2016-11-23 8 views
0

Так что я сделал это так:Как преобразовать адреса в NETMASK (десятичное)

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); 
    } 

} 

В основном то, что я вам взять адрес (скажем, это 4), и я создал массив с 1s и 0s (сделало его бинарной сетью). Затем я преобразовал этот массив в 4 переменные (numar1,2,3,4), которые я преобразовал в базу 10 (из 2). Так что, если мой адрес равен 4, выход будет 240.0.0.0, точно так же, как здесь: https://www.iplocation.net/subnet-mask Проблема в том, что этот код является настоящим беспорядком и ОЧЕНЬ незаменимым. Как я могу преобразовать этот адрес в сетевую маску (десятичную) эффективно? Могу ли я как-то работать с битами? Что-то вроде, возьмите первые 8 бит, преобразуйте их в базу 10, возьмите следующие 8 бит, преобразуйте их, возьмите следующий ... и т. Д.? Или я не знаю, что-то, что это не то, что ... плохо

Я нуб, я знаю, что это беспорядок

+2

Кроме того: у меня нет ответа, но, пожалуйста, привыкните размещать 'newline' в конце * каждого выражения' printf', а не в начале. То, что у вас есть, не является идиоматичным и вводит вас в заблуждение при печати отладочных сигналов. –

+0

что-то вроде 'htonl()' или 'htons()' будет вам полезной? – KevinDTimm

+0

Ваши петли, похоже, не знают, что массивы в C индексируются между '0' и' LEN-1', хотя вы не украсили нас определениями массива. –

ответ

0

Использование цикла и некоторые битовые операторы:

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 
} 

Теперь маска представляет собой (32-разрядное) целое число с соответствующим количеством бит. Теперь легко преобразовать его в десятичную. Например:

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; 

Теперь маска first.second.third.fourth

Надеется, что это очищает его, принять смотреть на побитовых операторах и пытаются обернуть голова вокруг них :)

+0

Так что если мой addr = 4, то для добавит 4 1s в начале маски и | 0x80000000 создаст 32-битное целое число, например 11110000.00000000.00000000.00000000? – Dafuq

+0

Да, сначала он устанавливает 31-й бит с помощью побитового или (mask = mask | 0x80000000), а затем на следующей итерации цикла он перемещает все биты вправо (mask = mask >> 1), а затем только 30-й бит. После этого он снова устанавливает бит № 31 (так что установлены биты 31 и 30). Вам просто нужно убедиться, что тип int может содержать 32 бита (4 байта), возможно, включает stdint.h и использовать uint32_t – Razbit

 Смежные вопросы

  • Нет связанных вопросов^_^