如何将网络掩码转换为网络前缀长度?

时间:2014-06-27 08:48:52

标签: c networking

我正在做一些编程,我想将网络掩码转换为网络前缀长度。

例如255.255.255.0 ----> 24。

最后,我写了一些代码来做到这一点。

const char *network = "255.255.255.0";
int n = inet_addr(netowrk);
int i = 0;
while (n > 0) {
    n = n << 1;
    i++;

}

我将成为网络计数

3 个答案:

答案 0 :(得分:6)

你应该首先尝试编译你的代码,它可以帮助你很多。由于您错误输入了变量名称&#34; netowrk&#34;

,因此存在编译错误

要计算前缀而不是左移,你应该尝试右移而不是使用inet_addr试试inet_pton()

有关详细信息,请查看帖子IPv4 to decimal different values?

您可以在这里查看代码:

int main()
{
    const char *network = "255.255.255.0";
    int n;
    inet_pton(AF_INET, network, &n);
    int i = 0;

    while (n > 0) {
            n = n >> 1;
            i++;
    }

    printf("network = %s, suffix = %d\n", network, i);
}

答案 1 :(得分:0)

我无法添加评论,但请注意Jaymin的答案取决于主机字节顺序。您应该使用ntohl(3)inet_pton返回的地址转换为主机字节顺序,然后使用左移,右移或位计数来获取前缀长度。

就此而言,你真的应该将struct sockaddr_in传递给inet_pton ......

答案 2 :(得分:0)

这适用于 IPv4 网络。

#include <arpa/inet.h>
#include <iostream>

int main() {
  // const char *network = "255.255.255.0";
  // const char *network = "255.0.0.0";
  // const char *network = "224.0.0.0";
  const char *network = "255.255.255.224";

  int ret;
  int count_ones = 0;      
  std::uint8_t byte;
  std::uint8_t buf[sizeof(struct in_addr)];

  ret = inet_pton(AF_INET, network, &buf);
  // assert(ret > 0);

  for (int i = 0; i < sizeof(struct in_addr); i++) {
    // std::cout << int(buf[i]) << std::endl;

    byte = buf[i];

    for (int j = 0; j < 8; j++) {
      count_ones += (byte & 1);
      byte >>= 1;
    }
  }

  std::cout << "network: " << network << ", suffix: " << count_ones << std::endl;
}