1. 程式人生 > >ip地址與整數之間的轉換

ip地址與整數之間的轉換

  • 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