项目中要用到对IP地址的排序,所以一般要将其转换为一个整型数,具体流程为:先将各点分十进制的IP值转为十六进制数,最后将整个十六进制组成一个字符,然后将其表示成一个十进制长整型数,在程序中范围应该使用long long型,否则可能造成越界,自己随便实现了一个:
/* transform IP string into long long decimal value */
long long ipstr_to_long(char *src)
{
int tmp[4];
char hexStr[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
int i = 0;
char *p = src, *q = NULL;
for (; i < 4; i ++)
{
if (i == 3)
{
tmp[i] = strtol(p, NULL, 10);
}
else
{
q = strchr(p, '.');
if (q == NULL)
{
return -1;
}
char vbuff[32];
memset(vbuff, 0, sizeof(vbuff));
strncpy(vbuff, p, q - p);
tmp[i] = strtol(vbuff, NULL, 10);
}
p = q + 1;
}
char buff[128];
memset(buff, 0, sizeof(buff));
int len = strlen(buff);
for (i = 0; i < 4; i ++)
{
int res = tmp[i], k = 0;
char hex_tmp[32];
memset(hex_tmp, 0, sizeof(hex_tmp));
while (res > 0)
{
int vtmp = res % 16;
hex_tmp[k] = hexStr[vtmp];
res = res / 16;
k ++;
}
while (k)
{
buff[len] = hex_tmp[k-1];
k--;
len ++;
}
}
long long ret_long = 0;
ret_long = strtoll(buff, NULL, 16);
return ret_long;
}