Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    11

    [C] conversione da indirizzo IP a intero

    Ciao a tutti,

    so che per convertire un indirizzo IP in un numero intero la formula da utilizzare è la seguente:

    256*256*256*byte1+256*256*byte2+256*byte3+byte4

    dove byte1,byte2,byte3,byte4 sono i 4 byte che compongono l'indirizzo IP.

    Il mio problema è che non devo prendere l'indirizzo IP al completo, ma solo i primi 21 bit più significativi e trasformarli in un numero intero.

    Avete idea di come possa fare?
    Grazie

  2. #2
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    ma l'indirizzo IP è un char* o qualche struttura sua?

  3. #3
    "Maschera" gli 11 bit meno significativi con un And.
    codice:
    int IP;
    /* ... */
    IP&=0xFFFFF800;
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    Originariamente inviato da MItaly
    "Maschera" gli 11 bit meno significativi con un And.
    codice:
    int IP;
    /* ... */
    IP&=0xFFFFF800;
    sarebbe stato lo stesso
    IP&=00000000000;
    giusto?

  5. #5
    Originariamente inviato da ant_alt
    sarebbe stato lo stesso
    IP&=00000000000;
    giusto?
    No; il codice che scrivi darebbe sempre come risultato zero.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    Originariamente inviato da MItaly
    No; il codice che scrivi darebbe sempre come risultato zero.
    il mio codice sarebbe un AND del tipo
    codice:
    10101101.11001100.10101100.00110011 *
                00000.00000000.00000000
    non si può fare un AND tra numeri con numero di cifre diverse?
    dubbio stupido già
    ma a me sembra di si :master:

  7. #7
    Originariamente inviato da ant_alt
    il mio codice sarebbe un AND del tipo
    codice:
    10101101.11001100.10101100.00110011 *
                00000.00000000.00000000
    non si può fare un AND tra numeri con numero di cifre diverse?
    dubbio stupido già
    ma a me sembra di si :master:
    1. Se anche scrivi un certo numero di cifre, comunque resta il fatto che il tipo di dato in cui queste cifre vanno a finire è comunque un intero a 32 bit (nel caso specifico), per cui le cifre binarie sono e restano 32.
    2. Quando si effettua una qualunque operazione in cui una cifra di un numero va combinata direttamente con una cifra dell'altro (ad esempio l'addizione), si effettua implicitamente il padding del numero più corto alla lunghezza del numero più lungo con degli zeri. Quindi
    codice:
    10101101.11001100.10101100.00110011 &
                00000.00000000.00000000
    è uguale a
    codice:
    10101101.11001100.10101100.00110011 &
    00000000.00000000.00000000.00000000
    , per lo stesso motivo per cui
    codice:
    315 +
      3
    di fatto è
    codice:
    315 +
    003
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    11
    Grazie ragazzi, i vostri messaggi mi sono stati molto utili.

    Vi chiedo conferma su quello che ho fatto:

    ho trasformato l'indirizzo IP in un intero secondo l'equazione x=256^3*byte1+256^2*byte2+256*byte3+byte4

    e poi, per considerare solo i primi 21 bit, ho aggiunto la riga che mi avete scritto voi IP&=0xFFFFF800;

    Mi confermate che va bene così? grazie ancora

  9. #9
    x=256^3*byte1+256^2*byte2+256*byte3+byte4
    Sì, ma tieni presente che in C l'operatore ^ non è elevamento a potenza, ma XOR bit a bit (se non ricordo male). Per ottenere il risultato che vuoi te senza scomodare la funzione pow (che lavora in virgola mobile e non va bene per questo) devi fare
    codice:
    int IP;
    IP=(byte1<<24 | byte2<<16 | byte3<<8 | byte4) & 0xFFFFF800;
    ;
    la parte dentro la parentesi costruisce l'IP, mentre la parte fuori maschera i primi 21 bit; tra l'altro dal momento che gli ultimi 11 bit in questo caso non vengono nemmeno considerati teoricamente potresti anche lasciare da parte byte4.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    11
    Grazie davvero per le dritte che mi dai!

    A dire il vero scrivendo:
    int IP;

    IP=(byte1<<24 | byte2<<16 | byte3<<8 | byte4) & 0xFFFFF800;

    da terminale visualizzo il valore che ottengo facendo:

    IP=256*256*256*byte1+256*256*byte2+256*byte3+byte4

    cioè ottengo il valore che otterrei senza maschera.

    Com'è possibile?

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 © 2024 vBulletin Solutions, Inc. All rights reserved.