Laden...

Subnetmask prüfen

Erstellt von fneuweiler vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.194 Views
F
fneuweiler Themenstarter:in
17 Beiträge seit 2005
vor 18 Jahren
Subnetmask prüfen

Also ich habe eine Subnetmask: 255.255.255.0

--> 111111111.1111111.11111111.00000000

Ich soll irgendiwe die Subnetmask in uint umwandel (klappt) und dann überprüfen wann die erste Null kommt und danach Testen ob danach eine 1 kommt wie funktioniert das??

mfg fneu

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo fneuweiler,

Du machst eine Bit-Rechtsverschiebung so lange bis die Überprüfung von



uint subnetzmaske = ...;
int counter = 0;

while ( (counter < 33) && ((subnetz & 1) == 0)
{
   // eventuell ist folgende Anweisung syntaktisch falsch:
   // kommt noch aus der C/C++ Zeit
   subnetzmaske = subnetzmaske >> 1;
}


zutrifft. Ich würde sagen, das geht am besten. Danach gibt Dir der Counter an, an welcher Stelle sich das erste gesetzte Bit befindet.

Wie man jetzt in C# ein Bit-Rechtsschift geht, das weiß ich nicht mehr, aber das sollte im Internet zu finden sein.

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

F
fneuweiler Themenstarter:in
17 Beiträge seit 2005
vor 18 Jahren

Ich kapier gar nix.

Also ich sag nochmal was ich bis jetzt hab:

Ich die Subnetzmaske 255.255.255.0 / 255.255.255.253 /...

in 4 Teile gesplitet: a1: 255 a2: 255 a3: 255 a4: 253

Ich will jetzt überprüfen wann im binärmodus eine 0 kommt und wenn die 0 da ist soll er überprüfen ob nacher der 0 nochmal eine 1 kommt!

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo fneuweiler,

also ich würde die Subnet-Maske NICHT in 4 Teile teilen. Ich würde sie in EINEN UInt wandeln.

Dann kannst Du so vorgehen, wie ich gepostet habe.

Es geht einfach nur darum, dass die Subnetzmaske, so wie Du sie angegeben hast (z.B. 255.255.255.0) schon in 4 Teile gesplittet ist, was wandelst Du da noch um?

Wenn Du es schaffst, diese 4 Teile in einen UInt zu packen, dann hast Du den Binärstream in einer Variable.

Sorry, habs jetzt mal schnell ausprobiert, und hab gesehen, dass ich in meinem vorigen geposteten Source geschlampert hab (keine Absicht).

Folgendes ist ausprobiert und funktioniert:


			int counter = 0;

			uint teil1 = 255;
			uint teil2 = 255;
			uint teil3 = 128;
			uint teil4 = 0;

			uint subnet = ((teil1 << 24) | (teil2 << 16) | (teil3 << 8) | teil4);

			while ( (counter < 33) && ((subnet & 1) == 0))
			{
				subnet = (subnet >> 1);
				counter++;
			}

			if (counter == 32)
			{
			   Console.WriteLine("Keine 1 gefunden im Binaerstream!");
			}
			else
			{
			   Console.WriteLine("Die erste 1 befindet sich an position: {0}", 
counter.ToString() );
			}

Wenn noch Klärungsbedarf, dann bitte schreiben...

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

4.221 Beiträge seit 2005
vor 18 Jahren

Du kannst auch die einzelnen Bytes mit Convert.ToString(byte,2) in einen binärstring umwandeln

dann hast Du 00001111 und kannst dort z.B: mit IndexOf usw... prüfen wo die erste 1 kommt



			uint teil1 = 255;
			uint teil2 = 255;
			uint teil3 = 128;
			uint teil4 = 0;

			
			string strBin=string.Concat(Convert.ToString(teil1,2),Convert.ToString(teil2,2),Convert.ToString(teil3,2),Convert.ToString(teil4,2));

			//die erste 1
			int intFirst=strBin.IndexOf("1");

			System.Diagnostics.Debug.WriteLine(intFirst);


Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

F
fneuweiler Themenstarter:in
17 Beiträge seit 2005
vor 18 Jahren

@norman_timo: Kannst du mir evtl. die Funktion erklären also was passiert was mit den Werten vor sich geht.

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo fneuweiler,

zunächst einmal, die Lösung von Programmierhans funktioniert ebenso, und lässt sich leichter nachvollziehen, weil die Strings jederzeit im Debug Modus anzuschauen sind.

Aber nichtsdestotrotz erkläre ich Dir, was in meinem Code passiert.

Die ersten 4 Zeilen sind wohl klar, oder?


            uint teil1 = 255;
            uint teil2 = 255;
            uint teil3 = 128;
            uint teil4 = 0;

Das sind nur die Werte in UInt Zahlen ausgedrückt, die solltest Du ja parat haben, so wie Du geschrieben hast.

Die Zeile 5:

uint subnet = ((teil1 << 24) | (teil2 << 16) | (teil3 << 8) | teil4);

macht folgendes:
teil1 ist ein UInt und sieht so in Binär aus (32 Bit ohne Vorzeichen):

00000000 00000000 00000000 11111111

ebenso sieht teil2 auch aus.

teil 3 sieht so aus:

00000000 00000000 00000000 10000000

teil4 klar, alles 0-en.

Also alle Teile der Subnetzmaske benutzen momentan nur die letzten 8 Bits (weil maximum von 255!).

Damit alle Bitmuster zu einem kompletten UInt zusammengesetzt werden können, werden die einzelnen Teile an die passende Stelle geschoben und mit einem logischen ODER verknüpft.

teil1 kommt auf die ersten 8 Bits im Ziel-UInt, teil2 auf Bit9-16, teil3 auf Bit 17-24 und der letzte Teil auf die letzten 8 Bits.

Das sieht dann so aus:
teil1<<24 ergibt:
11111111 00000000 00000000 00000000
teil2<<16 ergibt:
00000000 11111111 00000000 00000000
teil3<<8 ergibt:
00000000 00000000 10000000 00000000
teil4 bleibt:
00000000 00000000 00000000 00000000

Und das mit Oder verknüpft ergibt:
11111111 11111111 10000000 00000000

Somit hast Du EIN Uint, das die gesamte Subnet hält.

Jetzt kannst Du überprüfen, wie lange denn die '0' an letzter Stelle steht, wenn Du den gesamten Binärstream immer wieder nach rechts verschiebst. Dabei zählst Du die Verschiebeanzahl mit (counter).

Das macht folgende Anweisung:


            while ( (counter < 33) && ((subnet & 1) == 0))
            {
                subnet = (subnet >> 1);
                counter++;
            }

Danach weißt Du an welcher Position von rechts aus gesehen die erste '0' "erscheint", und somit hast Du die Anzahl Nullen gleich mit dabei 😉

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

F
fneuweiler Themenstarter:in
17 Beiträge seit 2005
vor 18 Jahren

hmm aber ich will doch testen wann die erst 0 kommt un ob danach, also nach der 0 nochmal eine 1 kommt. wenn nach der 0 nochmal eine 1 kommt ist die Subnetmask ungültig!!!

4.221 Beiträge seit 2005
vor 18 Jahren

Original von fneuweiler
hmm aber ich will doch testen wann die erst 0 kommt un ob danach, also nach der 0 nochmal eine 1 kommt. wenn nach der 0 nochmal eine 1 kommt ist die Subnetmask ungültig!!!

Achso...



			uint teil1 = 255;
			uint teil2 = 255;
			uint teil3 = 128;
			uint teil4 = 0;

			
			string strBin=string.Concat(Convert.ToString(teil1,2),Convert.ToString(teil2,2),Convert.ToString(teil3,2),Convert.ToString(teil4,2));

			
			bool blnNetmaskValid=strBin.IndexOf("1",strBin.IndexOf("0"))==-1;


Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

F
fneuweiler Themenstarter:in
17 Beiträge seit 2005
vor 18 Jahren
  		  
bool blnNetmaskValid=strBin.IndexOf("1",strBin.IndexOf("0"))==-1;  
  

Kannst du mir den Teil Code erklären?

4.221 Beiträge seit 2005
vor 18 Jahren

Original von fneuweiler

Kannst du mir den Teil Code erklären?

Wie die Online - Hilfe zum Befehlssatz funktioniert weisst du aber ?

bool blnNetmaskValid=strBin.IndexOf("1",strBin.IndexOf("0"))==-1;

11111111111111111111111111110000

strBin.IndexOf("0") liefert die erste 0 des strings
strBin.IndexOf("1") liefert die erste 1 ab der Position wo die erste 0 gefunden wurde

==-1 bedeutet dass keine 1 mehr gefunden wurde.

Dies funzt bei allen SubnetMasks (ausser 255.255.255.255 da dann IndexOf("0") minus 1 liefert und somit IndexOf("1") eine Runtime-Exception auslösen wird.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo fneuweiler,

wie wärs mit einer RegEx überprüfung?

Programmierhans's String nehmen, und dann mit einem RegEx-Pattern folgender Art überprüfen (Bitte überprüfen, da ich überhaupt kein Regex-Experte bin):

[1*][0*]

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”