IPv4-Header in Dezimal und Binär

Invictus9196

Mitglied
Moin Leute,

für TL;DR kann auch direkt die Aufgabenstellung im Anhang angeschaut werden.
Problem 1: Bei der Binär-Version werden keine Nullen vorangestellt (4 wird 100 und nicht etwa 00000100)
Problem 2: IP ist ein String. Wie kann ich Gültigkeit überprüfen. Momentan kann wirklich alles als IP eingetragen werden.

ich bin angehender Fachinformatiker für Systemintegration und daher stehe ich mit Programmierung grundsätzlich auf Kriegsfuß. Wäre ich gut im Programmieren, hätte ich schließlich Fachinformatiker für Anwendungsentwicklung ausgewählt. ;)
Aber genug davon, ihr seid bestimmt nicht für meine Geschichten hier, sondern weil ihr so nett seid und Anfängern helft.

Und zwar geht es um die Erstellung eines IPv4-Headers, der in Dezimal sowie Binär dargestellt werden kann.
Es sollen also Werte für bestimmte Teile eingegeben werden (Set und Get Funktion), einige Werte sind fest vorgegeben. Diese sollen in Dezimalschreibweise (z.B. 4-4-6-0-192.168.178.5-188.169.154.29) dargestellt werden. Dieser String soll nun in Binär umgewandelt werden.
Hier tritt das erste Problem1 auf: eine 4 wird nun so dargestellt 100. Es fehlen also die vorangestellten Nullen! Nun hatte ich die clevere Idee, ein tolle Methode zu schreiben, die bei jedem Wert folgendes prüft:

Wert >= 128 = nichts hinzufügen, sonst Wert >= 64 = 1 Null hinzufügen usw.

Das scheint mir jedoch eine sehr unelegante Lösung zu sein. Bestimmt gibt es Funktionen, die dies wesentlich einfacher lösen. Leider hat mein Klassenlehrer das Struktogramm für o.g. Gedankenspiel gesehen und möchte dies nun gerne umgesetzt haben.
Wie genau muss ich da rangehen? Ich stehe echt auf dem Schlauch.

Das nächste Problem2 besteht darin, die IP auf Gültigkeit zu überprüfen. Da es sich um einen String handelt, kann da so ziemlich alles eingetragen werden, ohne falsch zu sein.



danke im Voraus!
euer Invictus
 

Anhänge

  • IP4.zip
    5,3 KB · Aufrufe: 33
  • Aufgabe.jpg
    Aufgabe.jpg
    183,6 KB · Aufrufe: 73

Jardcore

Top Contributor
IP ist ein String. Wie kann ich Gültigkeit überprüfen. Momentan kann wirklich alles als IP eingetragen werden.
Aus Zeitgründen kann ich gerade nicht deinen kompletten Post verinnerlichen deswegen erstmal nur ein Lösungsansatz für das Problem Nummero 2. ---> Reguläre Ausdrücke.

Du kannst einen String mit der match() Methode anhand eines Regulären Ausdrucks prüfen. Das heißt du schaust ob dein String einem bestimmten Muster folgt.
Java:
String ip = "198.168.0.15";
if(ip.match("((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}((25[0-5])|(2[0-4][0-9])|(1?[0-9][0-9]?))") {
}
Wenn du Google nach regulären Ausdrücken befragst, wirst du noch mehr Infos erhalten. Den obigen habe ich auch gerade nur kopiert: http://www.computer-masters.de/ip-adresse-als-regulaerer-ausdruck.php

Es fehlen also die vorangestellten Nullen
Wieso benötigst du eigentlich die vorangestellten Nullen? 4 binär ist 100 :) oder 0100 oder 00100 ... usw.

Achja...
Laut Aufgabenstellung musst du die Gültigkeit deiner Eingaben gar nicht prüfen :)
 
Zuletzt bearbeitet:

Invictus9196

Mitglied
Danke für die schnelle Antwort! Ich habe keine Ahnung, weshalb wir das mit Nullen auffüllen sollen, aber das ist Vorgabe vom Lehrer :(

Ich würde die IP jetzt gerne solange abfragen, bis die Eingabe gültig ist. Also habe ich eine Schleife gebaut, die genau das Gegenteil macht: sie fragt solange, bis man endlich etwas ungültiges eingibt :D
Ich weiß zwar, warum das passiert, aber wie kann ich das umkehren?

Java:
do {
        System.out.println("Bitte geben Sie die Ziel-IP ein: ");
        setIpStr2(s.next());
        }
        while(ipStr2.matches("\\b((25[0–5]|2[0–4]\\d|[01]?\\d\\d?)(\\.)){3}(25[0–5]|2[0–4]\\d|[01]?\\d\\d?)\\b"));
 
K

kneitzel

Gast
Und ich bin jetzt nur auf dem Handy für diese Woche, daher kann ich die ZIP Datei nicht ansehen. Aber mit System.out.printf kann nan auch führende Nullen mit ausgeben z.B. mir %04d oder so. NumberFormat kannst du dir da mal näher ansehen. Ansonsten geht es doch auch über eine einfache Schleife wenn Du die Zahl als String haben solltest. Sows wie for(int i =zahlString.lenght; i<=8; i++) System.out.print("0"); vor die Azsgabe der Zahl setzen. Aber es sollte mit einerNumberFormat funktionieren.
 

Invictus9196

Mitglied
Super, das funktioniert jetzt! :) Du hast mir echt weitergeholfen — danke dir!

Ich kann den Code (zumindest aus der Klasse, Main steht ja eigentlich eh nichts drin) auch hier posten, dann ist die ganze Geschichte glaube ich auch für alle anderen nachvollziehbarer:
Java:
package ip4;
import java.util.Scanner;
import java.util.regex.Pattern;

public class Ipv4_Hdr {
  
    public static final int version = 4, flags = 3, protokoll = 0, hdr_chks = 0, fragm_offset = 000, ihl = 6, paketlaenge = 6, kennung = 0;
    private int tos = 24, ttl = 32;
  
    private String ipStr1;
    private String ipStr2;
  
    Scanner s = new Scanner(System.in);
  
  
    public void eingaben() {
      
        do {
            System.out.println("Bitte geben Sie den Wert für ToS ein: ");
            setTos(s.nextInt());
            if (getTos() > 255 || getTos() < 0) {
                System.out.println("Wert zu groß oder klein");
            }
        }
        while (getTos() > 255 || getTos() < 0);
      
        do {
            System.out.println("Bitte geben Sie einen Wert für TTL ein: ");
            setTtl(s.nextInt());
            if (getTtl() < 0 || getTtl() > 255) {
                System.out.println("Wert zu groß oder klein");
            }
        }
        while (getTtl() < 0 || getTtl() > 255);
      
        do {
        System.out.println("Bitte geben Sie Ihre IP ein: ");
        setIpStr1(s.next());
        }
        while(!ipStr1.matches("\\b((25[0–5]|2[0–4]\\d|[01]?\\d\\d?)(\\.)){3}(25[0–5]|2[0–4]\\d|[01]?\\d\\d?)\\b"));
      
        do {
        System.out.println("Bitte geben Sie die Ziel-IP ein: ");
        setIpStr2(s.next());
        }
        while(!ipStr2.matches("\\b((25[0–5]|2[0–4]\\d|[01]?\\d\\d?)(\\.)){3}(25[0–5]|2[0–4]\\d|[01]?\\d\\d?)\\b"));
      
//        validateIP(ipStr1);          
//        validateIP(ipStr2);      
      
    }
  
//    public static void validateIP(String ipStr) {
//        String regex = "\\b((25[0–5]|2[0–4]\\d|[01]?\\d\\d?)(\\.)){3}(25[0–5]|2[0–4]\\d|[01]?\\d\\d?)\\b";
//        System.out.println(ipStr + " gültige IP? " + Pattern.matches(regex, ipStr));
//    }
  
    public void ausgabe() {
        System.out.println(version+"-"+ihl+"-"+tos+"-"+paketlaenge+"-"+kennung+"-000-"+fragm_offset+"-"+ttl+"-"+protokoll+"-"+hdr_chks+"-"+ipStr1+"-"+ipStr2);
        System.out.println(toBinaryString());
    }
  
    public void setTos(int tos2) {
        tos = tos2;
    }
    public int getTos() {
        return tos;
    }
  
    private String toBinaryString() {
        String binary = "";
        binary += Integer.toBinaryString(version);
        binary += " ";
        binary += Integer.toBinaryString(ihl);
        binary += Integer.toBinaryString(tos);
        binary += " ";
        binary += Integer.toBinaryString(paketlaenge);
        binary += " ";
        binary += Integer.toBinaryString(kennung);
        binary += " ";
        binary += Integer.toBinaryString(flags);
        binary += " ";
        binary += Integer.toBinaryString(fragm_offset);
        binary += " ";
        binary += Integer.toBinaryString(ttl);
        binary += " ";
        binary += Integer.toBinaryString(protokoll);
        binary += " ";
        binary += Integer.toBinaryString(hdr_chks);
        binary += " ";
        binary += Integer.toBinaryString(ttl);
        binary += " ";
              
        String[] ipParts = getIpStr1().split("\\.");
      
        for(String ipPart : ipParts) {
            System.out.println("Part: " + ipPart);
            binary += Integer.toBinaryString(Integer.parseInt(ipPart));
        }

        binary += " ";
      
      
        return binary;
    }
  
    public int getTtl() {
        return ttl;
    }

    public String getIpStr1() {
        return ipStr1;
    }

    public String getZ_ip() {
        return ipStr2;
    }

    public void setTtl(int ttl) {
        this.ttl = ttl;
    }

    public void setIpStr1(String ipStr1) {
        this.ipStr1 = ipStr1;
    }

    public void setIpStr2(String ipStr2) {
        this.ipStr2 = ipStr2;
    }

}
 

Jardcore

Top Contributor
"\\b((25[0–5]|2[0–4]\\d|[01]?\\d\\d?)(\\.)){3}(25[0–5]|2[0–4]\\d|[01]?\\d\\d?)\\b" am besten noch in eine Konstante speichern, um Codecopy zu vermeiden.
Java:
private static final String IPv4 = "\\b((25[0–5]|2[0–4]\\d|[01]?\\d\\d?)(\\.)){3}(25[0–5]|2[0–4]\\d|[01]?\\d\\d?)\\b";
 

Neue Themen


Oben