【问题标题】:What is the easiest way to truncate an IP address to /24 in C?在C中将IP地址截断为/ 24的最简单方法是什么?
【发布时间】:2015-10-29 21:03:46
【问题描述】:

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

编辑:

IP 地址是 IPv4,并以点分十进制格式存储,并用引号括起来为 char *。我期望 /24 也是char *

示例格式:"64.233.174.94"

/24 预期格式:“64.233.174.0”

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

【问题讨论】:

标签: c parsing ip-address


【解决方案1】:

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

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

【讨论】:

  • 你的意思不是按位与它们吗?
【解决方案2】:

另一个答案是为实际程序执行此操作的更好方法。

您是否意识到点分十进制表示法仅用于使 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 或任何形式。然后,您将转换回字符串格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    相关资源
    最近更新 更多