ip地址與整數之間的轉換 阿新 • • 發佈:2019-01-11 IP地址轉換為整數:IP地址每段可以堪稱是8位無符號整數即0~255,把每段拆分成一個二進位制形式,組合起來,然後把這個二進位制數變啊層一個無符號32位整數。整數轉換為IP地址:把這個整數轉換成一個無符號32位二進位制數。從左到右,每八位進行一下分割,得到4段8位的二進位制數,把這些二進位制數轉換成整數然後加上“.”就可以了。IP地址轉換成二進位制的程式碼: #include<iostream> #include<stdio.h> #include<stdlib.h> #include<cassert> using namespace std; int *dec2bin(int decnum) { int i,a,*b={0}; a=decnum; for(i=7;i>=0;i--) { b[i]=a%2; a=a/2; } return b; } int ipToInt(char *ipString) { assert(ipString!=NULL); int i=0,j,n,l,count=0,return_num=0; char *tmp; int *tmp_num,*num,*d2b; char *s=ipString,*s_tmp; if(*s=='.') count++; count++; if(count!=4) return 0; while(*s!='\0') { if(*s!='.') { n=s-s_tmp; tmp=(char*)malloc(n*sizeof(char)); memcpy(tmp,s,n); tmp_num[i]=atoi(tmp); d2b=dec2bin(tmp_num[i]); for(j=0;j<8;j++) num[8*i+j]=d2b[j]; s++; i++; s_tmp=s; } s++; } if(*s='\0') { n=s-s_tmp; tmp=(char*)malloc(n*sizeof(char)); memcpy(tmp,s,n); tmp_num[i]=atoi(tmp); d2b=dec2bin(tmp_num[i]); for(j=0;j<8;j++) num[8*i+j]=d2b[j]; } for(j=0;j<32;j++) return_num=return_num*2+num[j]; return return_num; } int main(void) { char *string; string="192.168.12.56"; cout<<string; int num,i; num=ipToInt(string); printf("The result is:"); //for(i=0;i<32;i++) // printf("%d",num[i]); cout<<num; system("pause"); return 0; } 方法2:C++中IP地址的轉換及判斷(轉自:http://blog.chinaunix.net/uid-439869-id-2403088.html) 1)IP地址,是由網路地址的部分加上主機地址的部分組成的。例如: 172.24.12.61(A/28) 這個描述方式表示了這個IP地址所屬的網路是一個28位掩碼的網路。所謂網路掩碼,是一個連1+連0組成的IP地址型別的地址,一個掩碼的末尾有多少位連續的0(e.g. x個),就表示這個子網可以有2^x個主機地址。IP地址最長也只有32位,所以A/28就表示前面28位都是1,那麼最後就有4個0,所以這個網路的掩碼就是255.255.255.240.(240=0xF0) 那麼上面那個IP地址的子網地址是怎麼得出來的呢?就是用IP地址和子網掩碼做一下“與”運算,即: 172.24.12.61&255.255.255.240=172.24.12.48 可見,這個子網的網路地址就是172.24.12.48,那麼172.24.12.61的主機地址就是13. 補充一下,所謂“與”運算,其實是把十進位制的數字換算成二進位制以後的“與”。 一個子網裡,子網網路地址通常是不分配給主機用的,而且,子網的廣播地址也是不分配的。子網的廣播地址指的就是子網網路地址的後面那幾個0的作為主機地址的值都是1的IP地址。那麼在這個例子裡,子網廣播地址就是:172.24.12.63。 要判斷兩個IP地址是否屬於同一子網,可以把兩個IP地址分別與他們的子網掩碼“與”一下,如果得到同一個子網地址,那就屬於同一子網的了。 2)在C++中,要把一個IP地址的字串轉換成一個可以直接用來做“與”運算的數字,可以用這個函式。 inet_addr()將網路地址轉換成二進位制的數字 相關函式 inet_aton, inet_ntoa 表頭檔案 #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> 定義函式 unsigned long int inet_addr(const char *cp); 函式說明 inet_addr()用來將引數cp所指的網路地址字串轉換成網路所使用的二進位制數字。網路地址字串是以數字和點組成的字串。 返回值:成功則返回對應的網路二進位制的數字。失敗返回-1. 3)C++中,反過來,如果要把一個這種運算完成的二進位制數字直接生成一個IP地址的字串的話,可以用下面這個函式。 inet_ntoa()將網路二進位制的數字轉換成網路地址 相關函式 inet_addr,inet_aton 表頭檔案 #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> 定義函式 char * inet_ntoa(struct in_addr_in); 函式說明 inet_ntoa()用來將引數in所指的網路二進位制數字轉換成網路地址,然後將指向此網路地址字串的指標返回。 返回值:成功則返回字串指標,失敗則返回NULL。 結構in_addr定義如下 struct in_addr { unsigned long int s_addr; } 4)程式碼例子: unsigned long int ip=inet_addr(ipString.c_str()); in_addr subnetIp; subnetIp.s_addr=ip &Mask; subnetIpAddr=inet_ntoa(subnetIp); 5)說明: 需要注意的是,在使用以上兩個函式的時候,要在引用的標頭檔案里加上上面所提到的三個標頭檔案: #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> 此外,在編譯的時候,還需要在makefile里加上兩個連結庫問價(nsl和socket)。否則的話會出現ld的錯誤。 轉載處連結: http://blog.sina.com.cn/s/blog_7124c26901014ncv.html