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

来源:互联网 发布:linux arm环境 编辑:程序博客网 时间:2024/05/18 02:44

int ipstr2int(const char *ip, unsigned int *ipvalue){if (ip == NULL || ipvalue==NULL)return -1;unsigned intresult = 0;inttmp = 0;intshift = 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说明不是IPreturn 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;}


0 0
原创粉丝点击