将IP转换为数字

项目中要用到对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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值