当时没写的很烂,记下来练习加深印象
//IPV4to32位整数
//255.255.255.255《》0xFFFFFFFF
int ipstr2int(const char *ip, unsigned int *ipvalue) {
if (ip == NULL || ipvalue == NULL) {
return -1;
}
const char* pEnd = ip;
const char* pStart = ip;
int tmp = 0;
unsigned int result = 0;
int shift = 24;
while (*pEnd != '\0') {
//找到字符串里的','
while (*pEnd != '.'&&*pEnd != '\0') {
pEnd++;
}
tmp= 0;
while (pStart < pEnd) {
tmp = tmp * 10 + (*pStart - '0');
pStart++;
}
if (tmp < 10 || 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;
}
//32toIPV4位整数
int ip2str(unsigned int ip, char*buf, size_t len) {
if (buf == NULL || len < 16) {
return -1;
}
size_t length = sizeof(ip);
unsigned char* p = (unsigned char *)&ip + sizeof(ip) - 1;//指向ip地址最高字节,低位优先
char* p1 = buf;
while (length) {
unsigned char tmp = *p;
char * pstart = p1;
//18-->'81'
do//除10取余再逆置
{
*p1++ = tmp % 10 + '0';
} while (tmp);
char * pend = p1 - 1;//pend指向最后一个字符
//'81'->'18'
for (; pstart < pend; pstart++, pend++) {
char ch = *pstart;
*pstart = *pend;
*pend = ch;
}
if (length > 1) {
*p1++ = '.';//加上.,最后一个不加
}
length--;
p--;
}
*p1 = '\0';
return 1;
}