Newsgroup: it.comp.lang.javascript
Titolo: [1/2 OT] JScript - contare gli IP all'interno di un range

ciao
ho postato questo messaggio su it.comp.www.asp ma non me l'hanno
fatto passare, dunque provo qui.
Ecco la questione in termini + o - logici:
dati questi due IP
partenza 151.60.15.1
arrivo 151.79.18.255
devo sapere quanti IP ci sono tra i due dati
converto gli ip in arrays
decremento di 1 le cifre dell'IP più basso (per contare anche lo zero)
151 60 15  1
 |   |  |  |
150 59 14  0
se qualche elemento dell'IP di partenza è inferiore al corrispondente
nell'IP di arrivo vengono scambiati secondo l'equivalenza |A-B| =
|B-A|
sottraggo nel giusto ordine elemento per elemento:
255-0=255
18-14=4
79-59=20
151-150=1
moltiplico gli elementi
255*4*20*1=20400
ho scritto il seguente codice, funzionante alla condizione
che tutte le cifre dell'IP di partenza siano uguali o inferiori
alle corrispondenti nell'IP di arrivo.
è sbagliato? come si potrebbe migliorare?
<%@ Language=JScript %>
<%
/*
Le cifre dell'IP di partenza devono essere inferiori o 
uguali alle cifre dell'IP di arrivo:
es. IP part 218.25.14.1
    IP arr  218.29.50.255
*/
function num_IP_in_range(first,second) {
	var TMP_arr_part, TMP_arr_arr;
	var arr_part = new Array();
	var arr_arr = new Array();
	var arr_diff = new Array();
	var num_IP = new Number;
	TMP_arr_part = String(first);
	TMP_arr_arr = String(second);
	arr_part = TMP_arr_part.split(".");
	arr_arr = TMP_arr_arr.split(".");
 
	//qui sotto sottraggo 1 a ogni cifra dell'IP di partenza, partendo da
destra
	for (i=3;i>=0;i--) {
		arr_part[i]= (arr_part[i]==0)?arr_part[i]:arr_part[i]-1;
	}
 
	//questo ciclo for mette in un terzo array la differenza tra le cifre
	//degli IP del range, opportunamente ordinate per evitare numeri
negativi
	//secondo la regola |A-B|=|B-A|	
	for (i=3;i>=0;i--) {
		arr_diff[i] = ((arr_arr[i]-arr_part[i])>=0)?arr_arr[i]-arr_part[i]:arr_part[i]-arr_arr[i];
	}
 
	Response.Write(num_IP =
arr_diff[0]*arr_diff[1]*arr_diff[2]*arr_diff[3]);
}
%>
grazie in anticipo,
rae

 255*4*20*1=20400
Sei sicuro che questo ragionamento sia corretto?
Facciamo un po' di prove:
Partenza: 151.60.15.1
Destinazione: 151.60.16.253
Decremento di uno il minore:
150.59.14.0
Sottraggo:
253-0=253
16-14=2
60-59=1
151-150=1
253*2*1*1=506 numeri
Facciamo un'altra prova:
Partenza: 151.61.15.1
Destinazione: 151.60.15.255
Decremento di uno il minore:
150.59.14.254
Sottraggo:
254-1=253
15-14=1
61-59=2
151-150=1;
253*1*2*1=506 numeri
O c'e' qualcosa che mi sfugge, oppure e' l'approccio che sta alla base che
e' fondamentalmente sbagliato (in quanto non tiene di conto della
*posizione* in cui si trova l'elemento).
-- 
ZER0://coder.gfxer.web-designer/
~ You don't have to be crazy to be a webmaster. But it helps.

 *posizione* in cui si trova l'elemento).
secondo me la storia e' piu' semplice di quello che sembra ^^
gli indirizzi IPv4 sono interi senza segno a 32 bit, e quindi si puo'
calcolare:
startIP = 151 * 256^3 + 60 * 256^2 + 15 * 256^1 + 1 * 256^0
        = 
2537295617
endIP   = 151 * 256^3 + 79 * 256^2 + 18 * 256^1 + 255 * 256^0
        = 
2538541823
indirizzi = endIP - startIP = 1246206
per restare in topic, una bella funzione javascript scritta al volo:
function ipRange(ip1, ip2)
{
	return Math.abs(ip2int(ip2) - ip2int(ip1));
}
function ip2int(ip)
{
	var parts = new String(ip).split('.');
	if (parts.length != 4)
		return 0;
	var acc = 0;
	for (var i = 0; i < 4; i++)
	{
		acc += parts[i] * Math.pow(256, 3 - i);
	}
	return acc;
}
-- 
artemis.alpeia

 per restare in topic, una bella funzione javascript scritta al volo:
[cut]
Tra l'altro avevo gia' una funzione fatta tempo fa per la trasformazione
numerica degli IP (relativa ad un'applicazione XUL), che utilizza i
bitshift, non postata *sempre* per la medesima motivazione di cui prima..
.. ma il motto qua non era cercare di far ragionare le persone, laddove
possibile, invece di fornirgli la pappa pronta? ^_^;
-- 
ZER0://coder.gfxer.web-designer/
~ "L'unica persona che mi chiama con un numero che non conosco
e' il mio ragazzo." (Linda)

 possibile, invece di fornirgli la pappa pronta? ^_^;
ogni tanto specie dopo una ricca mangiata mi sento generoso ^^;;;;
-- 
#!/usr/bin/artemis.alpeia

 ogni tanto specie dopo una ricca mangiata mi sento generoso ^^;;;;
e se non fosse chiaro, anche un po' assonnato ;)
-- 
artemis[.alpeia]

 ogni tanto specie dopo una ricca mangiata mi sento generoso ^^;;;;
La prossima volta cerca di rammentartelo.. io cerchero' di essere piu'
esplicito.. evidentemente non lo sono stato a sufficienza ^_-
-- 
ZER0://coder.gfxer.web-designer/
~ "Rispetto e' Memoria, non Oblio."

 e se non fosse chiaro, anche un po' assonnato ;)
Ehm, non l'ho capita.
P.S.
Non ho ancora capito perche' le FAQ Wiki le vedi come una cosa "lontana";
cmq alla peggio si puo' sempre usare un'area tipo forum, ne ho qualcuno
sparso per il web che puo' fare al caso.
-- 
ZER0://coder.gfxer.web-designer/
~ Alcune persone sono ancora vive per il semplice motivo che e'
illegale ucciderle.

 sparso per il web che puo' fare al caso.
quello che pensavo era una faq periodica con l'essenziale e i puntatori ad
un sito web di approfondimento, se si puo' fare in modo che i contenuti
possano essere editati a piu' mani, in stile wiki, o si possano commentare,
come su 
php.net
, meglio
-- 
<artemis:alpeia xmlns:artemis="
http://utenti.lycos.it/artemis
" />

 come su 
php.net
, meglio
Infatti l'idea era quella, ma cosi' come di dare assieme forma alle
MetaFAQ: se vedi il TOC che ti ho postato, una delle prime voci e'
"Maintainers", al plurale. :)
P.S.
Ho visto che non avevi pubblicato le faq nell'area apposita di usenet; mi
sono permesso di farlo io indicandoti come autore all'interno del
documento.
-- 
ZER0://coder.gfxer.web-designer/
~ "Problemi" e' il nome che gli informatici danno a quelli che
comunemente verrebbero definiti "disastri"; altrimenti si chiamano
"features".

 [CUT]
grazie ad entrambi.
rae