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?
Umrechnung Dotted Quad in CIDR
- fragenfrager
- Beiträge: 658
- Registriert: 31.12.2003 08:47:15
Re: Umrechnung Dotted Quad in CIDR
Wie waer's mit dem Logarithmus?Es gilt(** 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: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
Code: Alles auswählen
$ echo 'l(128) / l(2)' | bc -ql
7.00000000000000000007
$
Code: Alles auswählen
a**b == log(b)/log(a)
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;
}
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
Re: Umrechnung Dotted Quad in CIDR
Schreiben wir es mal soCae hat geschrieben:Es giltCode: Alles auswählen
a**b == log(b)/log(a)
Code: Alles auswählen
a**b = c ; b = log(c)/log(a)
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