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

Przeliczanie adresów IPv4 C++

Object Storage Arubacloud
0 głosów
2,066 wizyt
pytanie zadane 5 stycznia 2016 w C i C++ przez Konrad Nabożny Stary wyjadacz (13,460 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 Ekspert (344,860 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,460 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 Ekspert (344,860 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,460 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 Ekspert (344,860 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,004 wizyt
0 głosów
2 odpowiedzi 399 wizyt
pytanie zadane 7 lutego 2022 w Rozwój zawodowy, nauka, praca przez Hubert731 Obywatel (1,650 p.)
0 głosów
1 odpowiedź 974 wizyt

92,550 zapytań

141,394 odpowiedzi

319,522 komentarzy

61,935 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...