- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
- int ipstr2int(const char *ip, unsigned int *ipvalue)
- {
- if (ip == NULL || ipvalue==NULL)
- return -1;
- unsigned int result = 0;
- int tmp = 0;
- int shift = 24;
- const char *pEnd = ip;
- const char *pStart = ip;
- while(*pEnd != '\0')
- {
- //到地址符里的’.’
- while(*pEnd != '.' && *pEnd != '\0')
- pEnd++;
- tmp = 0;
- //计算每个’.’之间的数值
- while(pStart < pEnd)
- {
- tmp = tmp * 10 + (*pStart - '0');
- pStart++;
- }
- if(tmp<0 || tmp >255)
- {
- return -1;
- }
- //将计算好的数值分别左移24位,16位,8位,0位
- result += (tmp << shift);
- shift -= 8;
- if (*pEnd == '\0')
- break;
- pStart = pEnd + 1;
- pEnd++;
- }
- *ipvalue = result;
- return 1;
- }
复制代码
- int ip2str(unsigned int ip, char *buf, size_t len)
- {
- if(buf == NULL || len<16)
- {
- return -1;
- }
- size_t length = sizeof(ip);//32位ip地址的字节数
- unsigned char *p = (unsigned char *)&ip+sizeof(ip)-1;//指 向ip地址最高字节
- char *p1 = buf;
- while(length)
- {
- unsigned char tmp = *p;
- char *pstart= p1;
- do
- {
- *p1++ = tmp%10 +'0';
- tmp /= 10;
- }while(tmp);
- //逆置
- char *pend = p1-1;
- for(;pstart<pend;pstart++,pend--)
- {
- char ch = *pstart;
- *pstart = *pend;
- *pend=ch;
- }
- if(length>1)
- *p1++ = '.';
- length--;
- //循环条件转换
- p--;
- }
- *p1 ='\0';
- return 1;
- }
复制代码
下面是我的答案:Ip转换到整数
- int Ip_to_Int(char *Ipstr)
- {
- if(NULL == Ipstr || '\0' == *Ipstr)
- return 0;
- char *pEntry = 0;
- char *pEnd = 0;
- int temp = 0;//用于记录转换后数字
- int Resule = 0;
- int count = 0;//用于记录.的个数 根据这个来移位
- int len = 0;//用于记录两个指针间的差
- pEntry = pEnd = Ipstr;
- if(*pEntry >'9' || *pEntry < '0')//如果第一个字符不是数字就返回了
- return 0;
- for (int i = 0; *pEnd != '\0'; i++)
- {
- if(*pEntry >'9' || *pEntry <'0')//不是这个范围就说明不是数字
- return 0;
- if(*pEnd == '.')
- {
-
- len = pEnd - pEntry;
- for (int k = 0; k <len; k++)
- {
- temp = temp * 10 + (*pEntry - '0');
- pEntry ++;
- }
- if(temp >255)//大于255说明不是IP
- return 0;
- Resule |= temp<<(count*8);
- count ++;
- //printf("Resule :0x%p\n",Resule);
- temp = 0;
- pEnd ++;//pEnd指向. 应该指向下一个有效数字
- pEntry = pEnd;
- }
- pEnd ++;
- }
- //最后一个不能用.为标志了
- temp = 0;
- len = pEnd - pEntry;
- for (int j = 0; j < len; j++)
- {
- temp = temp * 10 + (*pEntry - '0');
- pEntry ++;
- }
- Resule |= temp<<24;
- return Resule;
- //192.168.1.1 0x0101a8c0
- }
复制代码 至于整数到IP 我直接使用了sprintf 作弊了 哈哈
- char* Int_to_IP(unsigned int Ip,char* buff)
- {
- sprintf(buff,"%u.%u.%u.%u",
- (unsigned char)(*(char*)&Ip),
- (unsigned char)(*(char*)((char*)&Ip + 1)),
- (unsigned char)(*(char*)((char*)&Ip + 2)),
- (unsigned char)(*(char*)((char*)&Ip + 3))
- );
- return buff;
- }
复制代码 |
|