1. 程式人生 > >ip地址和整數轉換

ip地址和整數轉換

inet_addr函式
 地址轉換, 把"A.B.C.D"的IP地址轉換為32位長整數
[宣告]
 unsigned long inet_addr ( const char FAR *cp );
[引數]
 cp - 指向IP地址字串的指標
[返回值]
 當函式成功呼叫時返回用32位整數表示的IP地址
 失敗時返回INADDR_NONE.

實際是就是一個按位的排列,
比如 A.B.C.D的換成整數就是:
(((A*256)+B)*256+C)*256+D
1409823698 = 540833D2 H  => 以位元組分解: 54H 08H 33H D2H => 轉回10進位制: 84 08 51 210

看明白了嗎?
就是把每個段分別轉為16進位制,合併成整型:
1409823698 = (84 shl 24) or (8 shl 16) or (51 shl 8) or 210

合併轉為整型後因為最高位可能會是1,所以可能會出來負值,不用管它就行了。

例項:

uses WinSock;

ShowMessage(IntToStr(inet_addr('192.168.0.1')));

整數轉化為ip

Vc:

char* DottedDecimal(unsigned long ulAddr)
{
    static char szAddr[16] = {0};
unsigned long ulMask[4] = {0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000};
    for (int i = 0; i < 4; i++)
    {
long l = (ulAddr & ulMask[i]) >> (i * 8);
ltoa(l, szAddr + strlen(szAddr), 10);
if (i != 3)
strcat(szAddr, ".");
    }
return szAddr;
}

逆函式,網上查的:
7、將網路地址轉換為用點分割的IP地址,是上面函式的逆函式。
      char FAR *  inet_ntoa( struct in_addr in );
      舉例:char * ipaddr=NULL;
      char addr[20];
      in_addr inaddr;
      inaddr. s_addr=16777343;
      ipaddr= inet_ntoa(inaddr);
      strcpy(addr,ipaddr);
這樣addr的值就變為127.0.0.1。