Umrechnung Dotted Quad in CIDR

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Antworten
Benutzeravatar
fragenfrager
Beiträge: 658
Registriert: 31.12.2003 08:47:15

Umrechnung Dotted Quad in CIDR

Beitrag von fragenfrager » 30.04.2014 22:13:34

Steh grad voll aufm Schlauch:
Wie bekomme ich 255.255.255.128 in CIDR?

CIDR in Dotted Quad gehts ja so:
/26
32-26=6
2^(6)=64
256-64=192
somit ist die Subnetzmaske 255.255.255.192

Wenn ichs rückwärts versuche:
256-128=128
Welche Potenz zur Basis 2 ist 128? Welche Rechenoperation nehm ich denn dafür?
Klar habs mit tryanderror raus aber wie gehts mathematisch korrekt?

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Umrechnung Dotted Quad in CIDR

Beitrag von Cae » 30.04.2014 23:07:12

Wie waer's mit dem Logarithmus?

Code: Alles auswählen

$ echo 'l(128) / l(2)' | bc -ql
7.00000000000000000007
$ 
Es gilt

Code: Alles auswählen

a**b == log(b)/log(a)
(** bedeutet Potenzierung, was nicht wie ^ als binaeres Oder verwechselt werden kann.)

Effektiv wird man aber wohl eine Schleife bzw. eine Lookup-Tabelle nehmen, weil's kaum Speicher braucht und im Gegensatz zu den mathematisch korrekten Berechnungen laecherlich simpel (also schnell) sind. Beispiel:

Code: Alles auswählen

/* MIT License, author <cae@debianforum.de> */
#include <stdio.h>
#include <stdint.h>

int main(void) {
	uint8_t dot[] = { 255, 255, 255, 128 };
	uint8_t table[] = {
		0x01, 0x02, 0x04, 0x08,
		0x10, 0x20, 0x40, 0x80
	};

	printf("%d.%d.%d.%d\n", dot[0], dot[1], dot[2], dot[3]);

	char cidr = 0;

	int i, j;
	for (i = 0; i < 4; i++)
		for (j = 0; j < 8; j++)
			if (dot[i] & table[j])
				cidr++;

	printf("/%d\n", cidr);

	return 0;
}
i tackert die einzelnen Stellen durch, j die Tabelle mit den zweier-Exponenten. Sofern das entsprechende Bit (table[j]) im betrachteten Oktett der Subnetzmaske (dot) gesetzt ist, wird der CIDR-Zaehler inkrementiert. Das erkennt allerdings nicht-valide Masken wie 255.32.255.0 oder 255.255.255.8 nicht, die jeweils "Loecher" aus Nullbits drin haben.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

dufty2
Beiträge: 1714
Registriert: 22.12.2013 16:41:16

Re: Umrechnung Dotted Quad in CIDR

Beitrag von dufty2 » 01.05.2014 00:24:51

Cae hat geschrieben:Es gilt

Code: Alles auswählen

a**b == log(b)/log(a)
Schreiben wir es mal so

Code: Alles auswählen

a**b = c ; b = log(c)/log(a)
Aber Logarithmen sind für die Menschen zu komplex.
Man merkt sich einfach, wie oft man durch 2 teilen kann:
128 / 2 = 64 => 1x
64 / 2 = 32 => 2x
32 / 2 = 16 => 3x
16 / 2 = 8 => 4x
8 / 2 = 4 => 5x
4 / 2 = 2 => 6x
2 / 2 = 1 => 7x
1 / 2 = oopsi
somit 2**7 bzw. 32 - 7 = 25 also /25

Antworten