2013-09-28 18 views

risposta

2

Un numero intero a 32 bit, 570534080, può essere diviso in quattro interi senza segno a 8 bit, che sono l'indirizzo IP esatto.

int value = 570534080; // which is 0x2201a8c0 (0x22, 0x01, 0xa8, 0xc0) 
unsigned char *ip = &value; 
/* then */ 
ip[0] == 192; 
ip[1] == 168; 
ip[2] == 1; 
ip[3] == 34;  

Si prega di notare l'endian (big endian/little endian), il che rende @ risposta di KerrekSB invertito.

Modificato:

di rendere più chiaro Let.

Quando si parla di indirizzi IP e numeri interi, ci sei in realtà due tipi di interi ci interessiamo circa:

  1. La rappresentazione intero dell'indirizzo IP: 192.168.1.34 < ==>(((192 * 256 + 168) * 256 + 1) * 256 + 34
  2. I dati effettivi (flusso di bit forse) ricevete e interpretate in un numero intero a 32 bit, come quello che fornisce questo OP: 570534080 <==> (0x22, 0x01, 0xa8, 0xc0)(on a little-endian machine) <==> (34.1.168.192).

SI PREGA DI NOTARE CHE LA PIATTAFORMA È SPECIFICA E PERICOLOSA! Poiché questo si basa sull'ordine dei byte di un numero intero, che è chiamato endianess.

ANCORA A cura:

Qui avrei votato per @ commento di DavidHeffernan, che è quello di utilizzare inet_ntoa.

+0

Vedere il commento sotto la mia risposta. La tua soluzione non è il "contrario" del mio. Il mio è sempre corretto; il tuo ha bisogno di conoscere l'endianità della piattaforma. –

+0

@KerrekSB Mi dispiace ma non credo che il mio 'Il mio è sempre corretto;'. Si prega di consultare i miei aggiornamenti. – starrify

+0

Sì, hai ragione, non ho controllato il valore effettivo dell'OP. Ho pensato che fosse un indirizzo IP numerico, ma in realtà sono i dati del filo interpretati come un int. –

10
#include <stdio.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 

int main(void) { 
    int value=570534080; 
    struct in_addr addr = {value}; 
    printf("%s", inet_ntoa(addr)); 
    return 0; 
} 

prova: http://ideone.com/RCDgj4

Per Windows Utilizzare #include <winsock2.h>

+0

La funzione inet_ntoa non produce un numero intero "leggibile". date un'occhiata a http://stackoverflow.com/questions/30153966/why-do-inet-ntoa-and-inet-ntop-reverse-the-bytes –

+0

@ m.r226 Questo non è un numero intero leggibile – kotlomoy