在C中将IP地址截断为/ 24的最简单方法是什么?

时间:2015-08-06 15:56:18

标签: c parsing ip-address

是否有可以将IP地址截断为/ 24的方法? 或者,我应该手动解析IP地址并进行转换吗?

编辑:

IP地址是IPv4,并以引号char *包围的虚线十进制格式存储。我期待/ 24也是char *

示例格式:" 64.233.174.94"

/ 24预期格式:" 64.233.174.0"

希望这会有所帮助。感谢。

2 个答案:

答案 0 :(得分:1)

将IP地址和/ 24掩码的字符串规范转换为网络字节顺序的二进制IP地址,按位和它们一起,然后将结果转换为字符串:

#include <arpa/inet.h>
inet_ntoa(inet_addr("64.233.174.94") & inet_addr("255.255.255.0"))

答案 1 :(得分:0)

另一个答案是为真正的计划做更好的方法。

您是否意识到点分十进制表示法仅用于使人类更容易处理IP地址?实际上,计算机将IPv4地址存储为32位整数。

这是一些代码,它演示了如何从点分十进制字符串中获取整数值。请注意,这是我很快就被淘汰的内容,仅用于展示这个想法。

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
    const char* ip = "192.168.1.25";
    const char* p = ip;
    const int len = strlen(ip);
    int tmp, octet;
    unsigned accum, reducingmultiplier = 16777216;
    accum = tmp = octet = 0;
    for (int i = 0; i < len; ++i) {
        if (*p != '.') {
            tmp = *p - 0x30;
            octet *= 10;
            octet += tmp;
        }
        else {
            printf("got to dot, octet = %u\n", octet);
            accum += octet * reducingmultiplier;
            reducingmultiplier /= 256;
            octet = 0;
        }
        p++;
    }

    printf("got to end of string, final octet = %u\n", octet);
    accum += octet * reducingmultiplier;
    printf("String IP address: %s converted to an integer: %u\n", ip, accum);

    return 0;
}

一旦你将数字存储为一个整数,你就可以和你的子网掩码一起使用/ 24或任何形式。然后,您将转换回字符串格式。