我正在做一些编程,我想将网络掩码转换为网络前缀长度。
例如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++;
}
我将成为网络计数
答案 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;
}