• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przeliczanie adresów IPv4 C++

0 głosów
2,648 wizyt
pytanie zadane 5 stycznia 2016 w C i C++ przez Konrad Nabożny Stary wyjadacz (13,480 p.)

Witam, przyszło mi przeliczać adresy IPv4 na ilość hostów, adresy rozgłoszeniowe i tak dalej i tak dalej. Pierwszym krokiem jest zamiana adresu IP w Dec(10) na Bin(2). Napisałem początek programu, oczywiście jak rozwiążę ten problem to będę pisał resztę. Mianowicie gdy wpisuję jakieś IP dajmy na to znane wszystkim 192 168 0 1, to w pierwszym oktecie - binarnie, zawsze na końcu jest dopisywana jedna jedynka. Dzieje sie tak w przypadku innych cyfr. Podaję kod: (kompilując u siebie pamiętajcie aby nie podawać liczb > 255)

#include <iostream>
#include <math.h>
#include <cstdlib>

using namespace std;

int main()
{
    int decIp[3];
    int decMask[3];

    float IpBin1[7], IpBin2[7], IpBin3[7], IpBin4[7];
    float MaskBin1[7], MaskBin2[7], MaskBin3[7], MaskBin4[7];


        cout<<"Podaj adres IP rozdzielajac oktety spacja: ";
        cin>>decIp[0]>>decIp[1]>>decIp[2]>>decIp[3];
        //cout<<"Podaj adres maski podsieci rozdzielajac oktety spacja: ";
        //cin>>decMask[0]>>decMask[1]>>decMask[2]>>decMask[3];


        for (int i=0; i<8; i++)
        {
             IpBin1[i] = decIp[0] % 2;
             decIp[0] = (floor(decIp[0])/2);

             IpBin2[i] = decIp[1] % 2;
             decIp[1] = (floor(decIp[1])/2);

             IpBin3[i] = decIp[2] % 2;
             decIp[2] = (floor(decIp[2])/2);

             IpBin4[i] = decIp[3] % 2;
             decIp[3] = (floor(decIp[3])/2);
        }

        for (int i=7; i>=0; i--)
        {
            cout<<IpBin1[i];
        }
        cout<<".";
        for (int i=7; i>=0; i--)
        {
            cout<<IpBin2[i];
        }
        cout<<".";
        for (int i=7; i>=0; i--)
        {
            cout<<IpBin3[i];
        }
        cout<<".";
        for (int i=7; i>=0; i--)
        {
            cout<<IpBin4[i];
        }
        cout<<endl<<endl;

    system("pause");
    return 0;
}

 

Nie wiem dlaczego tak się dzieje, próbowałem na wiele różnych sposobów i nic z tego. 

1 odpowiedź

+1 głos
odpowiedź 5 stycznia 2016 przez adrian17 Mentor (354,880 p.)
wybrane 5 stycznia 2016 przez Konrad Nabożny
 
Najlepsza
Jeden problem jest trywialny: w wielu miejscach wychodzisz poza tablicę. decIP ma trzy elementy, ale edytujesz czwarty. IpBin1 ma 7 elementów, ale edytujesz ósmy. Najpierw to napraw.

Przy okazji, nie mam najmniejszego pojęcia, po co Ci tam floaty, floor() i te wszystkie tablice liczb. Adres IP da się zdekodować do jednej 32-bitowej liczby w jednej linijce kodu.
komentarz 5 stycznia 2016 przez Konrad Nabożny Stary wyjadacz (13,480 p.)
Dziękuję za odpowiedź. Nigdy nie bawiłem się w zamianę systemów liczbowych więc zrobiłem to tak jak wydawało mi się najprościej. Czy mógłbyś nakierować mnie na takie "jednoliniowe" rozwiązanie? Byłbym ogromnie wdzięczny. A co do floor'ów i float'ów to użyłem tego z racji na przypadki takie jak 123, które dzielone na 2 wynosi 61.5 co komputer powinien widzieć jako 61.
komentarz 5 stycznia 2016 przez adrian17 Mentor (354,880 p.)

. A co do floor'ów i float'ów to użyłem tego z racji na przypadki takie jak 123, które dzielone na 2 wynosi 61.5 co komputer powinien widzieć jako 61.

Ale gdybyś w ogóle nie używał floatów, to 123/2 wyjdzie 61 bez żadnego kombinowania.

proszę:

#include <iostream>
#include <bitset>
#include <stdint.h>
using namespace std;

int main()
{
    int decIp[4];
    cout << "Podaj adres IP rozdzielajac oktety spacja: ";
    cin >> decIp[0] >> decIp[1] >> decIp[2] >> decIp[3];

    uint32_t ip = decIp[0] << 24u | decIp[1] << 16u | decIp[2] << 8u | decIp[3];

    cout << "liczba: " << ip << "\n";
    cout << "binarnie: " << bitset<32>(ip) << "\n";
}
komentarz 5 stycznia 2016 przez Szykem2 Nałogowiec (29,510 p.)
Dodam tylko uwagę techniczno-językową nie ma czegoś takiego jak adres maski - tylko maska podsieci.
komentarz 5 stycznia 2016 przez Konrad Nabożny Stary wyjadacz (13,480 p.)
Racja, dzięki. W takim razie pokuszę się o jeszcze jedno pytanie, na które mam nadzieję znajdziesz czas by odpowiedzieć. W dalszym kroku działania programu do wyliczenia np Adresu sieci, potrzebuję użyć mnożenia dwójkowego działającego jak bramka logiczna AND, gdzie tylko 1 i 1 zwraca wartość 1. Da się zrobić to inaczej niż wypisując 32 mnożenia i warunki if, np deklarując takie porównanie na początku i które działa przez cały program. Wiesz co mam na myśli. Z góry bardzo dziękuję.
komentarz 5 stycznia 2016 przez adrian17 Mentor (354,880 p.)
Zajrzyj jeszcze raz do książki do C++a, bo dokładnie to robi operator &.

Podobne pytania

0 głosów
0 odpowiedzi 1,353 wizyt
0 głosów
2 odpowiedzi 902 wizyt
pytanie zadane 7 lutego 2022 w Rozwój zawodowy, nauka, praca przez Hubert731 Obywatel (1,650 p.)
0 głosów
0 odpowiedzi 504 wizyt
pytanie zadane 9 września 2024 w Sieci komputerowe, internet przez polandonion Dyskutant (7,710 p.)

93,729 zapytań

142,668 odpowiedzi

323,283 komentarzy

63,288 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...