【问题标题】:IP address to binary in CIP地址在C中的二进制
【发布时间】:2013-04-11 00:07:40
【问题描述】:

我有一个这样的IP地址:

address = '192.168.1.11';

并需要将其转换为二进制格式

11000000 10101000 00000001 00001011

我对如何左移十进制数和使用 inet_addr 有一些想法,但不知道该怎么做。

谢谢,我还是 C 的新手。

【问题讨论】:

  • 您想打印二进制字符串,还是只提供 4 个数字?困难的部分是将一个 8 位数字转换为一串二进制数字;标准 C 中没有一个简单的函数可以做到这一点。
  • @JonathanLeffler 我怀疑 OP 实际上只是想将其转换为本机整数类型,而不是“二进制格式”。大多数人对表示的概念感到困惑。
  • 您不想“通过”“。”进行解析;这 '。'告诉您何时到达数字的末尾。如果您发布一些代码以便人们可以看到您遇到的问题,您会得到更好的帮助。
  • 原生整数类型类似于charshortintlong 等。既然您需要位,那就是您想要的。当您谈论“格式”并将其显示为 0 和 1 和空格时,它看起来像一个字符串,乔纳森就是这样解释它的。请注意,虽然硬件将数字表示为一堆位,但它们没有“格式”……它们与二进制一样多是八进制或十六进制。所以你想要一些价值 0xC0A8010B
  • 我明白了。感谢您的建议。下次我会更清楚。

标签: c ip-address


【解决方案1】:

您可以使用inet_addr(3) 函数将字符串转换为in_addr_t,然后将其转换为二进制。没有标准的库函数可以将数字转换为二进制,但使用按位逻辑运算符非常简单。

【讨论】:

  • 我查看了文档,但不确定如何将 in_addr_t 转换为二进制?感谢您的建议。
  • inet_addr 将字符串转换为网络字节顺序中的 32 位 int,但没有迹象表明 OP 想要这样做,并且很难在机器中使用它(字节序) -独立的方式。
【解决方案2】:

有一个专门用于将文本 IP 转换为 32 位“longip”地址的套接字函数,但在这种情况下这可能是不必要的。一个简单的形式是使用 sscanf() 解析它:

char ip[] = "192.168.1.11";
int n1, n2, n3, n4;
sscanf(ip, "%d.%d.%d.%d", &n1, &n2, &n3, &n4).

// Result:

// n1 = 192
// n2 = 168
// n3 = 1
// n4 = 11

【讨论】:

  • 此代码不提供检查 IP 是否有效的方法。
【解决方案3】:

我会这样做:

char *addrc = '127.0.0.1';
inet_addr_t addri = inet_addr(addrc);
__bswap_32(addri); /* ommit if network byte order == host order */
char addrb[40];
itoa(addri,addrb,2);
printf("%s = %s (binary)",addrc,addrb);

【讨论】:

  • 你打错了,是in_addr_t。但这很好用。写的顺序不对。
猜你喜欢
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 2013-03-10
  • 2013-11-13
  • 2012-04-11
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
相关资源
最近更新 更多