Zum Inhalt springen

Netzwerkrechner


Tim2k

Empfohlene Beiträge

Hallo zusammen,

ich will einen Netzwerkrechner in JAVA programmieren, ähnlich dem von heise.de ( heise Netze - Netzwerk-Tools - Netzwerk-Rechner ).

Allerdings bin ich Anfänger in Sachen JAVA-Programmierung und weiss nicht wie ich aus dem CIDR-Wert die Netzmaske berechnen und darstellen soll.

Hat sowas vielleicht schon mal jemand gemacht oder kann mir sagen, wie ich an die Sache ran gehen soll?

Danke und viele Grüße,

Tim

Bearbeitet von Tim2k
Link zu diesem Kommentar
Auf anderen Seiten teilen

Sicher, dass dein Problem bei Java liegt und nicht da, wie man aus der CIDR-Schreibweise auf die Netzmaske kommt?

Das Suffix gibt die Anzahl der 1er-Bits in der Netzmaske an.

Bei /24 wäre die Netzmaske also z.B. 11111111.11111111.11111111.00000000 (binär)

Das muss man dann einfach nur noch in Dezimalwerte umwandeln und kommt somit auf die Subnetmask von 255.255.255.0.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wieso musst du denn auf binär oder "dotted decimal" kommen? Deine Eingabevariable muss doch nicht die gleiche sein, die du ausgibst. :confused:

Darstellen kannst du das doch wie du willst. Mit einem String z.B., oder aus 32 ints mit 3 Punkten dazwischen, ...

Muss das denn unbedingt tatsächlich errechnet werden?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Unterteile es doch einfach in die 4 Oktetts. (also den Punkt immer als Trennzeichen)

Dann dezimal in binär umwandeln und wieder zusammenhängen. Ich weiss nicht, wo da das Problem liegen soll. :confused:

Oder bau dir eine Schleife, die so viele 1en schreibt, wie durch die CIDR-Schreibweise angegeben und den Rest mit Nullen füllt. Da kannst du dann sogar noch reinbauen, dass jedes 9te Zeichen ein Punkt ist. Das alles als String speichern und du hast es... :rolleyes:

Bearbeitet von Crash2001
Link zu diesem Kommentar
Auf anderen Seiten teilen

naja ich hab eine variable "cidr", welcher per eingabe ein wert zugewiesen wird (z.b. 17). wie kann ich jetzt "cidr" in binär umwandeln, um die Netzmaske zu berechnen und dann als dotted decimal (255.255.128.0) auszugeben, ohne 32 if-anweisungen erstellen zu müssen um zu sagen, wenn "cidr" = 17, gib 255.255.128.0 aus; wenn "cidr" = 18 ... usw.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bin zwar, wegen dem Lerneffekt, eindeutig dagegen Lösungen einfach so zu posten. Aber da mich das Problem jetzt auch mal interessiert hat, hab ich mal was zusammen gebastelt. Ist vll nicht die eleganteste Lösung, aber sie funktioniert, jedenfalls soweit ich sie getestet habe.

Und da es mir jetzt eindeutig zu aufwendig war,die Lösung jetzt zu umschreiben sodass der OT sich selbst den Code ausdenken kann, post ich meinen Code hier einfach:


	private int[] mask = new int[4];


		int a = cidr / 8;

		if(a != 0) {

			for(int i = 0; i < a; i++)

				mask[i] = 255;

		}


		for(int b = cidr%8; b > 0;b--)

			mask[a] |= (256 >> ;


		if(a < 4) {

			for(int i = a+1; i < 4; i++)

				mask[i] = 0;

		}

[/code]

Im int-Array [font=Courier New]mask[/font] stehen die 4 Stellen der Adresse. Und [font=Courier New]cidr[/font] ist eine int Variable in der, wie der Name schon sagt, deine cidr drin steht.

Link zu diesem Kommentar
Auf anderen Seiten teilen


int cidr = 24;

int mask = 0xFFFFFFFF << 32-cidr;

cout << ((mask & 0xFF000000) >> 24)
<< ((mask & 0xFF0000) >> 16)
<< ((mask & 0xFF00) >> 8)
<< ((mask & 0xFF)) ;
[/PHP]

Also hier die Erklärung:

  1. 0xFFFFFFFF stellt einen Integer dar, der binär gesehen mit lauter Einsen gefüllt ist.
  2. Deine CIDR-Zahl ist in diesem Fall 24, d.h. die Netzwerkmaske besteht aus 24 Einsen + 8 Nullen.
  3. Das "<< 32-cidr" schiebt jetzt 8 Nullen von rechts in unseren komplett mit Einsen gefüllten Integer.
    Die Einsen die dabei vorne "rausfallen" sind einfach weg und stören nicht weiter
  4. das cout is der Standard-Output unter C++, wird also bei dir mit Java nicht funktionieren, hat aber keinen Einfluss auf die Funktionsweise
  5. "(mask & 0xFF000000)" maskiert unseren Subnetz-Integer so, dass nur die ersten 8 Bit (oder 1 Byte) übrig bleiben, der Rest sind also nur noch Nullen.
    Die für unsere gesuchte Zahl relevanten Daten (1 Byte, der erst Teil der IP-Adresse) stehen aber noch links im Integer.
    Würde man den Integer so als Zahl ausgeben, wäre die Zahl ziemlich groß, im Beispiel 4278190080.
    Da uns sowieso nur das erste Byte interessiert, schieben wir den Integer wieder um 3 Byte (24Bit) nach rechts. Die für uns interessanten 8 Bits stehen jetzt ganz rechts und vorne sind nur noch Nullen. Die resultierende Zahl ist also 255.
  6. Genauso funktioniert es mit der zweiten und dritten Stelle. Die Maskierung ist angepasst und es muss nur um 2, bzw 1 Byte gsechoben werden.
    Beim letzten Byte braucht man nichtmehr schieben, weil die Daten ja scho ganz rechts stehen.

Binär gesehen läuft das dann so:

[PHP]
Netzmaske:
11111111.11111111.11111111.11111111 entspricht 0xFFFFFFFF
11111111.11111111.11111111.00000000 um acht Stellen nach links schieben


Ausgabe:
1.Stelle:
11111111.11111111.11111111.00000000 Netzmaske
&& 11111111.00000000.00000000.00000000 Bitmaskierung 0xFF000000
--------------------------------------
11111111.00000000.00000000.00000000 das jetzt 24 Stellen nach rechts schieben
24>> 00000000.00000000.00000000.11111111 entspricht 255

2.Stelle:
11111111.11111111.11111111.00000000 Netzmaske
&& 00000000.11111111.00000000.00000000 Bitmaskierung 0xFF0000
--------------------------------------
00000000.11111111.00000000.00000000 das jetzt 16 Stellen nach rechts schieben
16>> 00000000.00000000.00000000.11111111 entspricht auch 255

Ich denke der Knackpunkt ist hierbei nur die Bitmaskierung. Dazu dürfte man aber bei Dr. Google ziemlich viel finden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

super, vielen dank für die erklärung. allerdings habe ich einen weitaus einfacheren weg gefunden. da ich ein array für die ip und eins für die netzmaske habe (mit jeweils 4 feldern), hab ich jetzt einfach die einzelnen felder (bytes) mit "&" verknüpt, und siehe da, funktioniert einwandfrei, da der operator "&" zwei ganzzahlige ausdrücke bitweise miteinander verknüpt. habe ich bis dato nicht gewusst, und wohl zu kompliziert gedacht. aber dennoch vielen dank!


int[] netid = new int[4];


        netid[0] = ip[0] & mask[0];

        netid[1] = ip[1] & mask[1];

        netid[2] = ip[2] & mask[2];

        netid[3] = ip[3] & mask[3];


System.out.println("- Die Netzadresse lautet : " + netid[0] + "." + netid[1] + "." + netid[2] + "." + netid[3]);

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Jahr später...

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...