AWT Subnetzmaske

Status
Nicht offen für weitere Antworten.

DoxyMoxy

Mitglied
Hey Leutz...

ich hab ein Problem und weiß nicht wie ich es am besten lösen kann...

also es geht um dieses Programm: siehe <hier>

jedenfals muss ich jetzt ein vergleich machen bzw eine ausgrenzung...

beispiel:

eine Subnetzmaske: 255.255.129.0

diese Subnetzmaske wurde vorher in eine Binär zahl umgewandelt... dann wurden alle einzen bis zur ersten 0 gezählt...

jetzt muss ich haben Prüfen ob es eine Gültige SNM ist... die 255.255.129.0 ist keine gültige da nur diese zahlen gehen... vom 2 - 4 Oktett: 128, 192, 224, 240, 248, 252, 254 und 255.

so wie mache ich es am besten... mit einer Binären vergleich...
ich hab jetzt schon soweit das ich erst die einsen zählen und dann von dem punkt bis hin zur ersten 1 wenn eine 1 vorhanden ist es eine ungültige SNM...


Programm ausschnitt:


Java:
private void initsubnetzmaske()
        {
            subnetzmaske = new int [4];
            SNM = new int[4];
            SNM_int = new int[5];
            
            subnetzmaske[0]=Integer.parseInt(textfield1_1.getText());
            subnetzmaske0 = Integer.toBinaryString(subnetzmaske[0]);
            String subnetz0 = subnetzmaske0;
            int SNM0 = 0;
            int SNM0_1 = 0;
            for(int i=0;i<subnetz0.length();++i){
                if(subnetz0.charAt(i) != '1'){
                    break;
                }
                ++SNM0;
            }
            for(int i=SNM0;i<subnetz0.length();++i){
                if(subnetz0.charAt(i) == '1'){
                	JOptionPane.showMessageDialog(null,"Ungültige Subnetzmaske");
                }
                ++SNM0_1;
            }
            
            subnetzmaske[1]=Integer.parseInt(textfield1_2.getText());
            subnetzmaske1 = Integer.toBinaryString(subnetzmaske[1]);
            String subnetz1 = subnetzmaske1;
            int SNM1 = 0;
            int SNM1_1 = 0;
            for(int i=0;i<subnetz1.length();++i){
                if(subnetz1.charAt(i) != '1'){
                    break;
                }
                ++SNM1;
            }
            for(int i=SNM1;i<subnetz1.length();++i){
                if(subnetz1.charAt(i) == '1'){
                	JOptionPane.showMessageDialog(null,"Ungültige Subnetzmaske");
                }
                ++SNM1_1;
            }
            
            subnetzmaske[2]=Integer.parseInt(textfield1_3.getText());
            subnetzmaske2 = Integer.toBinaryString(subnetzmaske[2]);
            String subnetz2 = subnetzmaske2;
            int SNM2 = 0;
            int SNM2_1 = 0;
            for(int i=0;i<subnetz2.length();++i){
                if(subnetz2.charAt(i) !='1'){
                    break;
                }
                ++SNM2;
            }
            for(int i=SNM2;i<subnetz2.length();++i){
                if(subnetz2.charAt(i) == '1'){
                	JOptionPane.showMessageDialog(null,"Ungültige Subnetzmaske");
                }
                ++SNM2_1;
            }
            
            subnetzmaske[3]=Integer.parseInt(textfield1_4.getText());
            subnetzmaske3 = Integer.toBinaryString(subnetzmaske[3]);
            String subnetz3 = subnetzmaske3;
            int SNM3 = 0;
            int SNM3_1 = 0;
            for(int i=0;i<subnetz3.length();++i){
                if(subnetz3.charAt(i) != '1'){
                    break;
                }
                ++SNM3;
            
            }
            for(int i=SNM3;i<subnetz3.length();++i){
                if(subnetz3.charAt(i) == '1'){
                    JOptionPane.showMessageDialog(null,"Ungültige Subnetzmaske");
                }
                ++SNM3_1;
            
            }
            // Oktett 1
        SNM[0] = SNM0;
        	// Oktett 1 + Oktett 2
        SNM[1] = SNM0 + SNM1;
        	// Oktett 1 + Oktett 2 + Oktett 3
        SNM[2] = SNM0 + SNM1 + SNM2;
        	// Oktett 1 + Oktett 2 + Oktett 3 + Oktett 4
        SNM[3] = SNM0 + SNM1 + SNM2 +SNM3;
        
        SNM_int[0] = SNM0_1;
                
        SNM_int[1] = SNM1_1;
                        
        SNM_int[2] = SNM2_1;
                                
        SNM_int[3] = SNM3_1;
        
        SNM_int[4] = SNM0_1 + SNM1_1 + SNM2_1 + SNM3_1;
                
       
        System.out.println(SNM[0]);
        System.out.println(SNM[1]);
        System.out.println(SNM[2]);
        System.out.println(SNM[3]);
        System.out.println(SNM_int[0]);
        System.out.println(SNM_int[1]);
        System.out.println(SNM_int[2]);
        System.out.println(SNM_int[3]);
        System.out.println(SNM0_1);
        System.out.println(SNM1_1);
        System.out.println(SNM2_1);
        System.out.println(SNM3_1);
                }

Java:
if(MySource==button2){
            	if((ip_adresse[0]>0) && (ip_adresse[0]<=127)&& (ip_adresse[1]<=255)&& (ip_adresse[2]<=255)&& (ip_adresse[3]<=255)){
            		if((SNM[1]>8) && (SNM[3]<=30) && (SNM_int[4]!=8)){
            			JOptionPane.showMessageDialog(null, "Sie haben eine Klasse A eingegeben!");
            		}else{
        				textfield1_1.setText("255");
        				textfield1_2.setText("0");        				
        				textfield1_3.setText("0");
        				textfield1_4.setText("0");
        				JOptionPane.showMessageDialog(null,"Die Subnetzmaske wurde auf Standard gesetzt!");
            		}
            		}else{
            			if((ip_adresse[0]>=128) && (ip_adresse[0]<=191)&& (ip_adresse[1]<=255)&& (ip_adresse[2]<=255)&& (ip_adresse[3]<=255)){
            				if((SNM[2]>16)&&(SNM[3]<=30) && (SNM_int[4]==0)){
            					JOptionPane.showMessageDialog(null, "Sie haben eine Klasse B eingegeben!");
            				}else{
            				textfield1_1.setText("255");
            				textfield1_2.setText("255");
            				textfield1_3.setText("0");
            				textfield1_4.setText("0");
            				JOptionPane.showMessageDialog(null,"Die Subnetzmaske wurde auf Standard gesetzt!");
  	                          
            				}
            				}else{
            					if((ip_adresse[0]>=192) && (ip_adresse[0]<=223) && (ip_adresse[1]<=255)&& (ip_adresse[2]<=255)&& (ip_adresse[3]<=255)){
            						if((SNM[3]>24) && (SNM[3]<=30)&& (SNM_int[4]<8)){
            							JOptionPane.showMessageDialog(null, "Sie haben eine Klasse C eingegeben!");
            						}else{
            							  textfield1_1.setText("255");
            	                          textfield1_2.setText("255");
            	                          textfield1_3.setText("255");
            	                          textfield1_4.setText("0");
            	                          JOptionPane.showMessageDialog(null,"Die Subnetzmaske wurde auf Standard gesetzt!");
            	                    }
            						}else{
            					JOptionPane.showMessageDialog(null,"Bitte geben sie vorher eine IP-Adresse ein!");
            }
          }
        }
      }

danke für eure hilfe schonmal im vorraus!!

PS:

also die aussortieren kann es schon... aber wenn eine Falsche ausgegeben wurde... sagt er erst "Ungültige SNM" und dann sie haben eine Klasse 'x' Adresse eingegeben!!
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Du machst das ganz schön kompliziert. Binär sieht das was gültig ist so aus (MSB ist links):
Code:
1000000
1100000
1110000
1111000
1111100
1111110
1111111
Mach Dir also eine Methode, die prüft, ob ein Block 2-4 gültig ist:
Java:
static boolean isValid(int mask) {
  if ((mask & 255) != mask || (mask & 128) == 0) {
    return false;
  }
  boolean previousBitSet = true;
  for (int test = 128; test > 0; test /= 2) {
    final boolean thisBitSet = (mask & test) != 0;
    if (!previousBitSet && thisBitSet) {
      return false;
    }
    previousBitSet = thisBitSet;
  }

  return true;
}
Test:
Java:
public static void main(String[] args) {
  for (int i = 1024; i >= -1024; i--) {
    if (isValid(i)) {
      System.out.println("Okay: " + i);
    }
  }
}
Ebenius
 

DoxyMoxy

Mitglied
Du machst das ganz schön kompliziert. Binär sieht das was gültig ist so aus (MSB ist links):
Code:
1000000
1100000
1110000
1111000
1111100
1111110
1111111
Mach Dir also eine Methode, die prüft, ob ein Block 2-4 gültig ist:
Java:
static boolean isValid(int mask) {
  if ((mask & 255) != mask || (mask & 128) == 0) {
    return false;
  }
  boolean previousBitSet = true;
  for (int test = 128; test > 0; test /= 2) {
    final boolean thisBitSet = (mask & test) != 0;
    if (!previousBitSet && thisBitSet) {
      return false;
    }
    previousBitSet = thisBitSet;
  }

  return true;
}
Test:
Java:
public static void main(String[] args) {
  for (int i = 1024; i >= -1024; i--) {
    if (isValid(i)) {
      System.out.println("Okay: " + i);
    }
  }
}
Ebenius

dank dir... ich weiß das ich mir das sehr kompliziert machen...
ich hätte ja auch einfach in der if anweisung gleich alle sachen angegeben können also z.b. in ein Array schreiben die einzelnen zahlen und dann einfach prüfen ob die zahl eingegeben wurde oder nicht...



außerdem funktioniert es ja schon außer das er immer noch gleich mit ausgibt wenn er sagt "ungültige SNM" das er danach noch irgendwie ausgibt sie haben das und das eingeben... aber mir wär lieber er soll in die Else anweisung gehen das er die Standard SNM eingibt...

also was ich damit meine... ist
Java:
if(MySource==button2){
                if((ip_adresse[0]>0) && (ip_adresse[0]<=127)&& (ip_adresse[1]<=255)&& (ip_adresse[2]<=255)&& (ip_adresse[3]<=255)){
                    if((SNM[1]>8) && (SNM[3]<=30) && (SNM_int[4]!=8)){
                        JOptionPane.showMessageDialog(null, "Sie haben eine Klasse A eingegeben!");
                    }else{
                        textfield1_1.setText("255");
                        textfield1_2.setText("0");                      
                        textfield1_3.setText("0");
                        textfield1_4.setText("0");
                        JOptionPane.showMessageDialog(null,"Die Subnetzmaske wurde auf Standard gesetzt!");
                    }

stats er immer sagt Sie haben eine Klasse A eingegeben! soll er in die else anweisung springen... also stimmt ja irgendwas nicht mit dem vergleich (SNM_int[4]!=8)
ich müsste einfach ein Array anlegen mit den einzelnen zahlen... für 128 - 255... das wär das einfachste... denk ich mal
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben