IPv4前缀长度为网络掩码

时间:2013-11-28 10:42:12

标签: c bit-manipulation ipv4

转换的一个选项可能是:

IN_ADDR NetMask;
NetMask.S_un.S_addr = PrefixLength ? (0xFFFFFFFF >> (32 - PrefixLength)) : 0;

但是有更标准/可移植的方式吗?

2 个答案:

答案 0 :(得分:1)

这不适用于不是8的幂的前缀长度。考虑长度为20,您需要0xF0FFFF(网络顺序)。这意味着你会想做这样的事情:

PrefixLength ? htonl(~((1 << (32 - PrefixLength)) - 1)) : 0

或者看this answer。但是你需要一个htonl调用或者一个比简单移位更复杂的东西来获得网络顺序的网络掩码。

答案 1 :(得分:0)

没关系,只要你使常数无符号,所以右移是明确定义的:

NetMask.S_un.S_addr = PrefixLength ? (0xFFFFFFFFu >> (32 - PrefixLength)) : 0;