Jak przekonwertować 32-bitową wartość całkowitą na adres IP?Konwersja liczby całkowitej na adres IP
Mam int value=570534080
i chcę przekonwertować go na 192.168.1.34
.
Jak przekonwertować 32-bitową wartość całkowitą na adres IP?Konwersja liczby całkowitej na adres IP
Mam int value=570534080
i chcę przekonwertować go na 192.168.1.34
.
32-bitowa liczba całkowita tutaj, 570534080
, może być podzielona na cztery 8-bitowe liczby całkowite bez znaku, które są dokładnym adresem IP.
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;
Proszę zanotować endian (duży endian/little endian), co powoduje, że odpowiedź @ KerrekSB jest odwrócona.
edycja:
Załóżmy, czyniąc go bardziej zrozumiałym.
Mówiąc o adresie IP i liczb całkowitych, nie są właściwie dwa rodzaje liczb całkowitych możemy zaniepokojenie:
192.168.1.34
< ==>(((192 * 256 + 168) * 256 + 1) * 256 + 34
570534080 <==> (0x22, 0x01, 0xa8, 0xc0)(on a little-endian machine) <==> (34.1.168.192)
.PROSZĘ ZWRÓCIĆ UWAGĘ, ŻE JEST PLATFORMA SZCZEGÓLNA I NIEBEZPIECZNA! Ponieważ zależy od kolejności bajtów liczby całkowitej, która jest nazywana endianess.
PONOWNIE edycja:
Tutaj będę głosować na @ komentarzu DavidHeffernan, która jest w użyciu inet_ntoa
.
Zobacz komentarz pod moją odpowiedź. Twoje rozwiązanie nie jest "odwrotnością" mojego. Mój jest zawsze poprawny; twoja musi znać endianness platformy. –
@KerrekSB Przykro mi, ale nie wierzę, że twoje 'Mine jest zawsze poprawne;'. Zobacz moje aktualizacje. – starrify
Tak, masz rację, nie sprawdziłem rzeczywistej wartości PO. Myślałem, że to numeryczny adres IP, ale w rzeczywistości jest to dane przewodowe interpretowane jako int. –
#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;
}
Test: http://ideone.com/RCDgj4
Dla Windows użyj #include <winsock2.h>
Funkcja inet_ntoa nie daje "czytelnej" liczby całkowitej. spójrz na http://stackoverflow.com/questions/30153966/why-do-inet-ntoa-and-inet-ntop-reverse-the-bytes –
@ m.r226 Nie chodzi o czytelną liczbę całkowitą – kotlomoy
Można zadzwonić 'inet_ntoa' –