看流星社区

 找回密码
 注册账号
查看: 1850|回复: 0

算法练习Ip地址与整数的互相转换ipstrToint

[复制链接]

该用户从未签到

发表于 2017-6-1 13:33:53 | 显示全部楼层 |阅读模式
复制代码
  1. int ipstr2int(const char *ip, unsigned int *ipvalue)
  2. {
  3.         if (ip == NULL || ipvalue==NULL)
  4.                 return -1;
  5.         unsigned int        result = 0;
  6.         int        tmp = 0;
  7.         int        shift = 24;
  8.         const char *pEnd = ip;
  9.         const char *pStart = ip;
  10.         while(*pEnd != '\0')
  11.         {
  12.                 //到地址符里的’.’
  13.                 while(*pEnd != '.' && *pEnd != '\0')
  14.                         pEnd++;
  15.                 tmp = 0;
  16.                 //计算每个’.’之间的数值
  17.                 while(pStart < pEnd)
  18.                 {
  19.                         tmp = tmp * 10 + (*pStart - '0');
  20.                 pStart++;
  21.                 }
  22.                 if(tmp<0 || tmp >255)
  23.                 {
  24.                         return -1;
  25.                 }
  26.                 //将计算好的数值分别左移24位,16位,8位,0位
  27.                 result += (tmp << shift);
  28.                 shift -= 8;
  29.                 if (*pEnd == '\0')
  30.                         break;
  31.                 pStart = pEnd + 1;
  32.                 pEnd++;
  33.         }
  34.         *ipvalue = result;
  35.         return 1;
  36. }
复制代码


  1. int ip2str(unsigned int ip, char *buf, size_t len)
  2. {
  3.         if(buf == NULL || len<16)
  4.         {
  5.                 return -1;
  6.         }
  7.         size_t length = sizeof(ip);//32位ip地址的字节数
  8.         unsigned char *p = (unsigned char *)&ip+sizeof(ip)-1;//指 向ip地址最高字节
  9.         char *p1 = buf;
  10.         while(length)
  11.         {
  12.                 unsigned char tmp = *p;
  13.                 char *pstart= p1;
  14.                 do
  15.                 {
  16.                         *p1++ = tmp%10 +'0';
  17.                         tmp /= 10;
  18.                 }while(tmp);
  19.                 //逆置
  20.                 char *pend = p1-1;
  21.                 for(;pstart<pend;pstart++,pend--)
  22.                 {
  23.                         char ch = *pstart;
  24.                         *pstart = *pend;
  25.                         *pend=ch;
  26.                 }
  27.                 if(length>1)
  28.                         *p1++ = '.';
  29.                 length--;
  30.                 //循环条件转换
  31.                 p--;
  32.         }
  33.         *p1 ='\0';
  34.         return 1;
  35. }
复制代码


下面是我的答案:Ip转换到整数
  1. int Ip_to_Int(char *Ipstr)
  2. {
  3.         if(NULL == Ipstr || '\0' == *Ipstr)
  4.                 return 0;
  5.         char *pEntry = 0;
  6.         char *pEnd = 0;
  7.         int temp = 0;//用于记录转换后数字
  8.         int Resule = 0;
  9.         int count = 0;//用于记录.的个数 根据这个来移位
  10.         int len = 0;//用于记录两个指针间的差
  11.         pEntry = pEnd = Ipstr;
  12.         if(*pEntry >'9' || *pEntry < '0')//如果第一个字符不是数字就返回了
  13.                 return 0;
  14.         for (int i = 0; *pEnd != '\0'; i++)
  15.         {
  16.                 if(*pEntry >'9' || *pEntry <'0')//不是这个范围就说明不是数字
  17.                         return 0;
  18.                 if(*pEnd == '.')
  19.                 {
  20.                        
  21.                         len = pEnd - pEntry;
  22.                         for (int k = 0; k <len; k++)
  23.                         {
  24.                                 temp = temp * 10 + (*pEntry  - '0');
  25.                                 pEntry ++;
  26.                         }
  27.                         if(temp >255)//大于255说明不是IP
  28.                                 return 0;
  29.                         Resule |= temp<<(count*8);
  30.                         count ++;
  31.                         //printf("Resule :0x%p\n",Resule);
  32.                         temp = 0;
  33.                         pEnd ++;//pEnd指向. 应该指向下一个有效数字
  34.                         pEntry = pEnd;
  35.                 }
  36.                 pEnd ++;
  37.         }
  38.         //最后一个不能用.为标志了
  39.         temp = 0;
  40.         len = pEnd - pEntry;
  41.         for (int j = 0; j < len; j++)
  42.         {
  43.                 temp = temp * 10 + (*pEntry  - '0');
  44.                 pEntry ++;
  45.         }
  46.         Resule |= temp<<24;
  47.         return Resule;
  48.         //192.168.1.1 0x0101a8c0
  49. }
复制代码
至于整数到IP 我直接使用了sprintf 作弊了 哈哈

  1. char* Int_to_IP(unsigned int Ip,char* buff)
  2. {
  3.         sprintf(buff,"%u.%u.%u.%u",
  4.                 (unsigned char)(*(char*)&Ip),
  5.                 (unsigned char)(*(char*)((char*)&Ip + 1)),
  6.                 (unsigned char)(*(char*)((char*)&Ip + 2)),
  7.                 (unsigned char)(*(char*)((char*)&Ip + 3))
  8.                 );
  9.         return buff;
  10. }
复制代码
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-19 12:42

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表