Visualizzazione dei risultati da 1 a 8 su 8

Discussione: ip2long in javascript

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327

    ip2long in javascript

    Salve a tutti,

    avrei una curiosità da togliere.... allora ho uno script in javascript trovato su internet che mi trasforma un ip in decimale....

    codice:
    <script language="javascript">
    
    function Ip2Long(ip){
    
        try{
    
          var sip = ip.split('.');
    
          var lRet = parseFloat(sip[0] * 256 * 256 * 256)
    
                + parseFloat(sip[1] * 256 * 256)
    
                + parseFloat(sip[2] * 256)
    
                 + parseFloat(sip[3])
    
          return lRet;
    
        }
    
        catch(err){
    
          return 0;
    
        }
    
    }
    
    
    alert(Ip2Long('192.168.1.1'));
    
    
    </script>
    il risultato è 3232235777
    se converto lo stesso ip con la funzione predefinita di php (ip2long()), il risultato è diverso -1062731519.
    Allora nella funzione in javascript, senza neanche sapere quello che ho fatto, ho messo un and binario nel return

    return lRet & lRet;

    e adesso cosi lo script funziona, mi da lo stesso risultato di php.... qualcuno di voi saprebbe spiegarmi che fa aggiungedo l'AND binario??
    e poi perchè mi viene fuori un valore negativo?? se confrontiamo in binario questo valore 3232235777, dovrebbe uscire fuori sempre lo stesso.

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    non c'è nessuno che può aiutarmi?? inoltre qualcuno conosce una funziona che fa il contraio Long2Ip?

  3. #3
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    Nella funzione tu tratti escusivamente numeri positivi e giustamente ti restituisce un numero positivo, considera che i numeri in notazione binaria che hanno il bit piu' alto ad on sono, per convenzione, considerati negativi, forzando un and binario in javascript obblighi l'interprete a restituire lo stesso valore che rende php che, presumo, per quella funzione lavora in binario.

    Scusa la spiegazione maccheronica

    ciao
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    adesso ho capito un po ma per essermi più chiara la cosa, potresti farmi un piccolo esempio pratico??

  5. #5
    Vediamo di fare un po' di chiarimenti rispolverando l'esame di info 1

    dunque. Con long si intende un numero binario intero che occupa 4 byte (32 bit)

    i long si possono suddividere in signed e unsigned

    cioe' con segno e senza segno. Sono convenzioni e dipende da quale viene adottata da un particolare software/SO/interprete e chi piu' ne ha piu' ne metta.

    Se decidi di voler trasformare un IP in un long unsigned allora la tua funzione "funziona".

    Poiche con 4 Byte e' possibile codificare 2^32 numeri e' ovvio che i numeri che si possono ottenere con un signed non sono gli stessi che si ottengono con un unsigned.

    Mi spiego meglio: 3232235777 non e' codificabile come unsigned. Cioe' non c'e' nessuna sequenza di 4 byte che se interpretata come unsigned dia 3232235777.

    Mi spiego ancora meglio: 3232235777 in binario diventa:

    11000000 10101000 00000001 00000001

    ma questo numero ora puo' essere interpretato come unsigned (3232235777) oppure come signed.

    Se lo si interpreta come signed il 32esimo bit partendo da dx e' il segno (cioe' e' negativo perche' il bit vale 1)

    Per trasformare un unsigned in signed basta togliergli 2^32

    3232235777 - 2^32 = -1062731519

    Javascript non ha una forte tipizzazione per cui non hai modo di sapere come un numero venga salvato in memoria. Cioe' tu vedi il numero ma non sai se e' memorizzato come long o come byte etc...

    probabilmente l'utilizzo di operatori booleani forza javascript a trattare il numero come signed long ma non ci farei troppo affidamento.

    Sono stato poco chiaro? Di sicuro si'

    Ma sono qua' se hai altri dubbi sui quali io possa aumentare la tua confusione

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    non ho capito bene la differenza tra signed e unsigned

    e poi che vuol dire

    codice:
    Per trasformare un unsigned in signed basta togliergli 2^32
    
    3232235777 - 2^32 = -1062731519
    cmq grazie mille della tua spiegazione abbastanza dettagliata.

  7. #7
    si capisco la confusione, tra l'altro siamo al limite dell'OT.

    Faccio un esempio con un numero di tipo byte (8 bit) se non ti dispiace

    prendi

    10010101

    quanto vale? La risposta corretta e': "dipende da come lo interpretiamo" Nel senso che la stessa sequenza di bit puo' essere utilizzata per identificare cose diverse. Sono convenzioni. E ognuno applica la convenzione che trova piu' adatta. Puoi pure inventarti una regola tua se ti serve!!!!


    Quindi :

    Se lo interpretiamo come byte unsigned (senza segno) applichi le solite regolette di conversione e trovi 149

    ma possiamo decidere che invece e' un intero con segno (signed) allora dobbiamo vedere il bit piu' significativo. Che vale 1 e quindi e' un numero negativo. Ma quale numero negativo? Una regola veloce e' questa. 149 - 2^8 = 149 - 256 = -107 (8 perche' i bit sono 8, mentre il 149 viene da sopra)

    Da dove deriva questa regola? Ovviamente e' una convenzione. Ma se cerchi "notazione binaria" su goolge o wkikipedia troverai un po' di spiegazioni storiche. Esistono infatti altri modi di rappresentare i numeri negativi in binario ma questo e' il piu' comodo.

    Ultima domanda: come salva i numeri in memoria javascript? Non lo sappiamo con certezza.

    Altri linguaggi ti forzano a dichiarare il tipo. Quindi sei tu che scegli.

    Ho fatto chiarezza o ho peggiorato?

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    grazie mille adesso è veramente più chiaro... sei stato molto esauriente

    ho creato la funzione inversa

    codice:
    function long2ip(ip_start) {
    
    	var ip=0;
    
    	if (ip_start < 0){
    
    		ip = ip_start + 4294967296;
    
    	}
    
        with (Math) {
            var ip1 = floor(ip/pow(256,3));	
            var ip2 = floor((ip%pow(256,3))/pow(256,2));
            var ip3 = floor(((ip%pow(256,3))%pow(256,2))/pow(256,1));
            var ip4 = floor((((ip%pow(256,3))%pow(256,2))%pow(256,1))/pow(256,0));
        }
    
    
        return ip1 + '.' + ip2 + '.' + ip3 + '.' + ip4;
    }
    dato che nel caso di long parliamo di un numero binario di 32 bit, posso considerare che il segno sarà sempre e solo il primo bit da sinistra e il valore da sommare 4294967296....cmq una cosa che non mi è chiara c'è, 2 elevata 32 fa 4294967296 che convertendo in binario non sono 32 bit ma 33, cioè il primo bit è uno e invece di avere 31 0 ne ho 32

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.