首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CIDR地址计算(网络和广播地址)

CIDR地址计算(网络和广播地址)
EN

Stack Overflow用户
提问于 2014-07-15 02:01:55
回答 2查看 1.5K关注 0票数 0

我现在有点纠结于某件事:

尝试计算以下CIDR IP的网络/广播地址: 10.20.30.45/13。

据我所知,此IP的网络部分有13位长,这告诉我们在确定网络地址-> 10.X.0.0时,必须从第二个数字开始更改地址

但是X将是什么,我如何计算X呢?

EN

回答 2

Stack Overflow用户

发布于 2014-07-15 20:49:35

您可以将10.20.30.45转换为二进制,将/13转换为二进制,即255.248.0.0。

以二进制表示的10.20.30.45为00001010 00010100 00011110 00101101 255.248.0.0为11111111 11111000 00000000 00000000

然后比较它们:

代码语言:javascript
复制
00001010 00010100 00011110 00101101
11111111 11111000 00000000 00000000
______________________________________
00001010 00010000 00000000 00000000 => back to decimal is 10.16.0.0

要获得广播地址,您必须对CIDR或网络掩码地址进行二进制反转。

或者,您可以使用此CIDR converter为您自动执行此操作。

票数 2
EN

Stack Overflow用户

发布于 2014-08-14 19:12:25

在C(++)中:

代码语言:javascript
复制
#ifdef __FreeBSD__
#include <sys/socket.h>
#endif
#include <arpa/inet.h>
#include <netinet/in.h>

#include <cassert>
#include <cstdint>
#include <iostream>

int main() {
  in_addr net, broadcast;
  int bits = inet_net_pton(AF_INET, "10.20.30.45/13", &net, sizeof(net));
  assert((bits != -1));  // assert that inet_net_pton understood us
  // Apply CIDR mask to address to get the network
  if (bits > 0) {  // u32 << 32 is undefined
    uint32_t mask = htonl((0xFFFFFFFFu) << (32 - bits));
    net.s_addr &= mask;
  }
  broadcast = net;
  // Do the same for broadcast
  if (bits < 32) {
    uint32_t mask = htonl((0xFFFFFFFFu) >> bits);
    broadcast.s_addr |= mask;
  }
  std::cout << "Network: " << inet_ntoa(net) << std::endl;
  std::cout << "Broadcast: " << inet_ntoa(broadcast) << std::endl;
}

输出:

代码语言:javascript
复制
Network: 10.16.0.0
Broadcast: 10.23.255.255
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24742860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档