如何以正确的格式显示IPV6地址

时间:2013-11-09 19:01:13

标签: c++ ipv6

我有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

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分: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';