在研究SYGATE的记录库时发现他是用一个整数(有正有负)来表示一个IP地址的,例如:
10.23.34.207 对应 -819849462
210.51.8.84 对应 1409823698
61.135.134.99 对应 1669760829
有哪位知道他是按什么算法转换的? 
 
 

解决方案 »

  1.   

    inet_addr函数
     地址转换, 把"A.B.C.D"的IP地址转换为32位长整数
    [声明]
     unsigned long inet_addr ( const char FAR *cp );
    [参数]
     cp - 指向IP地址字符串的指针
    [返回值]
     当函数成功调用时返回用32位整数表示的IP地址
     失败时返回INADDR_NONE.
      

  2.   

    实际是就是一个按位的排列,
    比如 A.B.C.D的换成整数就是:
    (((A*256)+B)*256+C)*256+D
      

  3.   

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

  4.   

    举例:
    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,所以可能会出来负值,不用管它就行了。
      

  5.   

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

  6.   

    逆函数
    楼主的意思是把整数---->IP地址?
    下面是VC的,delphi的找不到
    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.   

    type
      PIp_Addr=^IP_Addr;
      Ip_Addr=record
         a,b,c,d:byte;
      end;
    var D:integer;
        Ip:PIp_Addr;
    begin
      D:=1409823698;
      Ip:=@D;
      showmessage(format('%d.%d.%d.%d',[IP.a,Ip.b,Ip.c,Ip.d]));
    end;
      

  8.   

    逆函数,网上查的:
    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。
    在DELPHI在使用inet_ntoa这个函数时总是
    [Error] Unit1.pas(30): Incompatible types: 'in_addr' and 'Integer'
    怎么把整数转换为in_addr类型呢?帮助里又没有。