Tim2k Geschrieben 21. Oktober 2008 Teilen Geschrieben 21. Oktober 2008 (bearbeitet) 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 21. Oktober 2008 von Tim2k Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Crash2001 Geschrieben 21. Oktober 2008 Teilen Geschrieben 21. Oktober 2008 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tim2k Geschrieben 21. Oktober 2008 Autor Teilen Geschrieben 21. Oktober 2008 ja ganau da liegt mein problem. im umgang mit den zahlenwerten. ich lese den CIDR-Wert als Integer ein, hab aber keine ahnung wie ich rechnerisch auf binär komme und diesen dann als dotted decimal darstellen soll. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Crash2001 Geschrieben 21. Oktober 2008 Teilen Geschrieben 21. Oktober 2008 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Wayne Geschrieben 21. Oktober 2008 Teilen Geschrieben 21. Oktober 2008 Nach kurzer Google-Suche kommt man unter anderem Hier hin Parsing and Formatting a Big Integer into Binary, Octal, and Hexadecimal (Java Developers Almanac Example) Und lernt dann, dass man unter anderem sowas machen kann: BigInteger i = new BigInteger("225"); System.out.println(i.toString(2)); War auch für mich neu. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tim2k Geschrieben 21. Oktober 2008 Autor Teilen Geschrieben 21. Oktober 2008 hm okay. bleibt noch die frage, wie ich von dem CIDR-Wert auf die dotted decimal schreibweise der netzwerkmaske komme. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Crash2001 Geschrieben 21. Oktober 2008 Teilen Geschrieben 21. Oktober 2008 (bearbeitet) 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... Bearbeitet 21. Oktober 2008 von Crash2001 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Wayne Geschrieben 21. Oktober 2008 Teilen Geschrieben 21. Oktober 2008 "Das kommt drauf an" Ich weiß nicht wie der Aufbau deines Programmes ist von daher ist es mir kaum möglich weiter zu helfen. Evtl. ändert sich das wenn du beschreiben würdest wo genau du die Probleme mit der Umsetzung hast. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tim2k Geschrieben 21. Oktober 2008 Autor Teilen Geschrieben 21. Oktober 2008 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 21. Oktober 2008 Teilen Geschrieben 21. Oktober 2008 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tim2k Geschrieben 23. Oktober 2008 Autor Teilen Geschrieben 23. Oktober 2008 danke, funktioniert! kann es auch soweit nachvollziehen, jedoch verstehe ich nicht wieso du das array als private deklariert hast. hat bei mir auch nur ohne das private funktioniert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 23. Oktober 2008 Teilen Geschrieben 23. Oktober 2008 Ach so ja, sry vergessen wegzunehmen. Ich hatte mir das als Klasse zusammen gebastelt und das int Array mask als privates Klassenattribut deklariert, deswegen das private. Wenn du das alles in eine Funktion schreibst muss das private natürlich weg. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tim2k Geschrieben 24. Oktober 2008 Autor Teilen Geschrieben 24. Oktober 2008 hat jemand ne idee wie man auf "elegante" art die netzadresse berechnen kann? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FinalFantasy Geschrieben 24. Oktober 2008 Teilen Geschrieben 24. Oktober 2008 hat jemand ne idee wie man auf "elegante" art die netzadresse berechnen kann? So etwa? int cidr = 24; int mask = 0xFFFFFFFF << 32-cidr; cout << ((mask & 0xFF000000) >> 24) << ((mask & 0xFF0000) >> 16) << ((mask & 0xFF00) >> 8) << ((mask & 0xFF)) ; [/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tim2k Geschrieben 24. Oktober 2008 Autor Teilen Geschrieben 24. Oktober 2008 bekomme ich in der zeile << ((mask & 0xFF)); die meldung: "not a statement" Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 24. Oktober 2008 Teilen Geschrieben 24. Oktober 2008 Liegt daran, dass das was FinalFantasy da gepostet hat, C ist und kein Java. Aber ansonsten sieht das eigentlich gut aus, hätte ich ja auch selber drauf kommen können :upps Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FinalFantasy Geschrieben 24. Oktober 2008 Teilen Geschrieben 24. Oktober 2008 Ja, ist mir nachher auch aufgefallen, dass ja eigentlich nach Java gefragt war, aber Shift-Operator und Binär-Und-Operator wirds ja wohl auch unter Java geben, oder? Wer verstanden hat, wies funktioniert, sollte da jedoch leicht auch auf andere Sprachen übertragen können Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tim2k Geschrieben 27. Oktober 2008 Autor Teilen Geschrieben 27. Oktober 2008 bekomme ich leider nicht hin. wie gesagt, bin anfänger. kann mir das vielleicht jemand erklären? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FinalFantasy Geschrieben 27. Oktober 2008 Teilen Geschrieben 27. Oktober 2008 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: 0xFFFFFFFF stellt einen Integer dar, der binär gesehen mit lauter Einsen gefüllt ist.Deine CIDR-Zahl ist in diesem Fall 24, d.h. die Netzwerkmaske besteht aus 24 Einsen + 8 Nullen.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 weiterdas cout is der Standard-Output unter C++, wird also bei dir mit Java nicht funktionieren, hat aber keinen Einfluss auf die Funktionsweise"(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.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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tim2k Geschrieben 27. Oktober 2008 Autor Teilen Geschrieben 27. Oktober 2008 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]); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FinalFantasy Geschrieben 27. Oktober 2008 Teilen Geschrieben 27. Oktober 2008 Deinen Codeauszug verstehe ich jetzt nicht ganz. netid ist ein leeres Array und was hast du im ip Array und was im mask Array drinstehen? Die mask müsstest du ja eben erst "berechnen", grad der Teil fehlt in deinem Auszug. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tim2k Geschrieben 28. Oktober 2008 Autor Teilen Geschrieben 28. Oktober 2008 das array ip wird byteweise per eingabe beschrieben. das array mask wird auf die art berechnet, die dragon8 gepostet hat. und die werte des leeren array netid wird wie oben beschrieben berechnet und ausgegeben Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
oxis76 Geschrieben 15. November 2009 Teilen Geschrieben 15. November 2009 Hast du es auch mal mit der Lib von Produkt: SubnetCalc - YouBlu.de - Die WebApp - Maker versucht? Da ist auch der Quellcode dabei, wenn du wissen willst, wie es geht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.