# IPv4-Header in Dezimal und Binär



## Invictus9196 (14. Mrz 2016)

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


----------



## Jardcore (14. Mrz 2016)

Invictus9196 hat gesagt.:


> 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.

```
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



Invictus9196 hat gesagt.:


> 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


----------



## Invictus9196 (14. Mrz 2016)

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 
Ich weiß zwar, warum das passiert, aber wie kann ich das umkehren?


```
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"));
```


----------



## kneitzel (14. Mrz 2016)

Das logische nicht ist ein !, also while(!Bedingung).


----------



## kneitzel (14. Mrz 2016)

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 (14. Mrz 2016)

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:

```
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 (15. Mrz 2016)

"\\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.

```
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";
```


----------



## Invictus9196 (16. Mrz 2016)

Ich habe das jetzt so eingebaut. Eine wesentlich elegantere Lösung als meine


----------

