【问题标题】:How to display IPV6 address in proper format如何以正确的格式显示 IPV6 地址
【发布时间】:2013-11-09 19:01:12
【问题描述】:

我有 8 个变量,每个变量都包含一个 IPV6 地址元素。例如,如果 IPV6 地址是 2001:0db8:0000:0000:0000:002a:0000:2adf

变量会是这样的:

char [] a1 = 2001;
char [] a2 = 0db8;
char [] a3 = 0000;
char [] a4 = 0000;
char [] a5 = 0000;
char [] a6 = 002a;
char [] a7 = 015f;
char [] a8 = 2adf;

我将这些变量放入字符串流并显示。目前最终结果为:2001:0db8:0000:0000:0000:002a:015f:2adf

我需要标准 IPV6 格式的最终​​结果,例如:2001:0db8::2a:15f:2adf

谁能帮帮我?

【问题讨论】:

  • 我们的目的不是为你编写所有代码。如果您不了解必要的逻辑,请参阅 RFC 4291 对其进行解释。
  • 其实不叫标准的ipv6格式。它被称为缩写的 ipv6 格式。而且这个例子是错误的。正确的缩写 ipv6 地址是:2001:db8::2a:15f:2adf。
  • @steve 感谢您的纠正
  • 在 rfc 4291 中有描述
  • RFC 5952 似乎解决了 4291 留下的很多歧义

标签: c++ ipv6


【解决方案1】:

首先,不要将它存储为字符串!然后,当您将其存储为例如一个八项unit16_t数组,那么你可以一个一个地打印它们,如果你注意到一个值是零,并且后面的值也是零,跳过零值的打印。

例如

uint16_t words[8] = {
    0x2001, 0x0db8, 0x0000, 0x0000,
    0x0000, 0x002a, 0x015f, 0x2adf
};

for (int i = 0; i < 8; i++)
{
    if (i > 0)
        std::cout << ':';

    if (words[i] == 0 && i < 8 && words[i + 1] == 0)
    {
        while (words[i + 1] == 0)
            ++i;
        continue;
    }

    std::cout << std::setfill('0') << std::setw(4) << std::hex << words[i];
}
std::cout << '\n';

【讨论】:

  • 能否举例说明一下
  • @ Joachim Pileborg if 条件中的 while 需要什么?
  • 代码错误。这不是缩写 ipv6 地址的工作方式。此代码: 可以在同一结果中多次写入字符串“::”,这是不允许的。第二个错误是你需要找到全为零的最大序列。
  • @steve 元素 0000 将在数组中存储为 0,所以我相信 if 条件对于搜索全零的最大序列是正确的
  • @Prats 不,我的代码并不像史蒂夫注意到的那样真正正确。但是,它可能会给您一个关于如何继续的想法或提示。您可能应该按照他的建议阅读 RFC。
猜你喜欢
  • 2019-05-18
  • 2010-11-17
  • 2011-08-10
  • 2013-01-16
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 2012-12-13
相关资源
最近更新 更多