如何计算ip地址为128.2.19.4且属于子网128.2.19.0/25的子网掩码。请给我详细的程序。我想学习计算。
答案 0 :(得分:3)
以下是您的示例算法:
子网掩码只是子网地址“/ 25”部分的表示。
在IPv4中,地址长度为32位,前25位为1:
1111 1111 1111 1111 1111 1111 1000 0000
地址以八位字节给出 - 每个8位:
octet 1 . octet 2 . octet 3 . octet 4
0000 0000 0000 0000 0000 0000 0000 0000
1111 1111 1111 1111 1111 1111 1000 0000
所以每个八位字节的十进制表示是:
255 . 255 . 255 . 128
这意味着你的子网掩码是:
255.255.255.128
答案 1 :(得分:1)
子网掩码是位掩码。 25表示32位中的25位(从顶部开始)用于网络,其余用于主机。
In bytes: 128.2.19.0
In binary 10000000 00000010 00010011 00000000
The bitmask: 11111111 11111111 11111111 10000000
Ergo: ------- network ------------ host
最后7位用于主机。作为字节的位掩码是255.255.255.128。
答案 2 :(得分:0)
您可以在C中完成此操作:
#include <stdio.h>
#include <arpa/inet.h>
uint32_t cidr_to_netmask(uint8_t cidr)
{
uint8_t unset_bits = 32 - cidr;
return ntohl(0xffffffff << unset_bits);
}
int main(void)
{
uint8_t cidr = 25;
uint32_t _netmask = cidr_to_netmask(cidr);
struct in_addr _netmask_addr = { _netmask };
char netmask[16];
if (inet_ntop(AF_INET, (struct in_addr *)&_netmask_addr, (char *)&netmask, sizeof(netmask)) == NULL) {
fprintf(stderr, "error.\n");
return 1;
}
printf("%d = %s\n", cidr, netmask);
return 0;
}
输出:
25 = 255.255.255.128