【发布时间】:2015-09-19 04:17:12
【问题描述】:
这是一个完整的未压缩 IP 地址 2001:0008:0000:CD30:0000:0000:0000:0101 我需要像这样压缩它 2001:8:0:CD30::101 但我只能像这样压缩块中的零 2001:8:0:CD30:0:0:0:101 使用此代码
string output = "";
string a = textBox1.Text;
if (a.Length != 39 )
MessageBox.Show("Invalid IP please enter the IPv6 IP in this format 6cd9:a87a:ad46:0005:ad40:0000:5698:8ab8");
else
{
for (int i = 0; i < a.Length; i++)
{
if ((a[i] >= '1' && a[i] <= '9') || (Char.ToLower(a[i]) >= 'a' && Char.ToLower(a[i]) <= 'f') || ((i + 1) % 5 == 0 && a[i] == ':'))
{
output = output + a[i];
}
else if ((a[i]=='0' && a[i-1]==':') || (a[i]=='0' && a[i-1]=='0' && a[i-2]==':') || (a[i]=='0' && a[i-1]=='0' && a[i-2]=='0' && a[i-3]==':'))
{
}
else if (a[i] == '0')
{
output = output + a[i];
}
else
{
MessageBox.Show("Invalid IP please enter the IPv6 IP in this format 6cd9:a87a:ad46:0005:ad40:0000:5698:8ab8");
}
}
textBox2.Text = output;
}
我正在使用 c#,但我只需要有关如何删除整个零块的编程逻辑问题是可能有超过 1 组包含 ip 中所有零的块,但只有一个应该缩写。
【问题讨论】:
-
你只需要去掉多余的 0 对吗?
-
是的,但问题是如果 IP 是这样的 2001:0000:0000:CD30:0000:0000:0000:a141 那么它将被缩写成这样 2001:0:0:CD30::a141和 nt 像这样 2001::CD30:0:0:0:a141 这意味着在 ip 中,整个零块只能压缩为两个冒号一次而且它必须来自连续的零块数量更多的地方,例如上面的示例 3 个零块被压缩,而其他块没有。
-
好的,所以问题是最后一个不遵守规则的“块”
-
@Balder,参见 RFC 5952,第 4.2.3 节:tools.ietf.org/html/rfc5952#section-4.2.3,“当在放置“::”时有替代选择时,最长的连续 16 位 0字段必须缩短(即在 2001:0:0:1:0:0:0:1 中缩短三个连续零字段的序列)。当连续 16 位 0 字段的长度相等时(即, 2001:db8:0:0:1:0:0:1),第一个零位序列必须缩短。例如,2001:db8::1:0:0:1 是正确的表示。"
标签: c# ip logic ipv6 abbreviation