ip地址增量问题

我想增加我的IP地址;

这是代码

ipAddressControl1.Text = "192.168.1.255"; byte[] ip = ipAddressControl1.GetAddressBytes(); ip[3] = (byte)(++ip[3]); IPAddress ipAddress1 = new IPAddress(ip); MessageBox.Show(ipAddress1.ToString()); 

或者我也尝试过这个

 ipAddressControl3.Text = "192.168.1.255"; IPAddress ipAddress1 = new IPAddress(ıpAddressControl3.GetAddressBytes()); ipAddress1.Address += 0x1 << 24; MessageBox.Show(ipAddress1.ToString()); 

但是他们两个都给了我192.168.1.0但是我希望得到192.168.2.0的值

你的问题是,当ip[3]环绕时,你不会增加ip[2] (依此类推)。 以下代码应该做到这一点,最后从255.255.255.255包装到0.0.0.0

 byte[] ip = ipAddressControl1.GetAddressBytes(); ip[3] = (byte)(ip[3] + 1); if (ip[3] == 0) { ip[2] = (byte)(ip[2] + 1); if (ip[2] == 0) { ip[1] = (byte)(ip[1] + 1); if (ip[1] == 0) { ip[0] = (byte)(ip[0] + 1); } } } 

以下也可能有效:

 byte[] ip = ipAddressControl1.GetAddressBytes(); if (++ip[3] == 0) if (++ip[2] == 0) if (++ip[1] == 0) ++ip[0]; 

值得注意的是,现有的答案都没有处理IP地址类本身确实需要的IPv6地址。 为此,您可能希望采用更一般的策略(我不确定IPv6的增量规则是什么样的,尽管它们可能完全相同,只需要更多的字节来完成它,我怀疑是案子)。

– 编辑:

在此基础上,这似乎有效:

  public static IPAddress Increment (IPAddress address) { IPAddress result; byte[] bytes = address.GetAddressBytes(); for(int k = bytes.Length - 1; k >= 0; k--){ if( bytes[k] == byte.MaxValue ){ bytes[k] = 0; continue; } bytes[k]++; result = new IPAddress(bytes); return result; } // Un-incrementable, return the original address. return address; } 

在第一个示例中,您只是递增第4个字节序列。 所以它会从255变为0而对byte [2]没有影响。

在第二个序列中,你将它递增1,然后你将它从2转换回1.我不确定你为什么选择这样做。

您需要检查您的地址是否为254 – 255且0是广播地址。

ipAddressControl1.Text =“192.168.1.255”;

 byte[] ip = ipAddressControl1.GetAddressBytes(); if (ip[3] != 255) { ip[3] = (byte)(++ip[3]); } else { ip[2] = (byte)(++ip[2]); ip[3] = (byte)0; } IPAddress ipAddress1 = new IPAddress(ip); MessageBox.Show(ipAddress1.ToString()); 

但是你只能检查溢出到ip [0] – 你需要注意,如果你在那里达到255。

看起来IP地址存储在您尝试使用的.Address属性中的“错误方法”:

 192.168.1.255 c0 a8 01 ff is stored as 0xff01a8c0 

因此,添加1 << 24只会增加左边的0xff ,然后截断它,将其变为0

如果您希望按照您描述的方式工作,则必须编写自己的附加function。

 public static IPAddress IncrementIP(IPAddress addr) { byte[] ip = addr.GetAddressBytes(); ip[3]++; if (ip[3] == 0) { ip[2]++; if (ip[2] == 0) { ip[1]++; if (ip[1] == 0) ip[0]++; } } return new IPAddress(ip); } 

或类似的东西。

您可以将IP转换为其等效数字。

查看此前已回答的问题了解详情:

Hibernate Entity中IP地址的最佳类型?

 public static string GetStandardIP(long numericIP) { string w = Convert.ToString(Convert.ToInt64(numericIP / 16777216) % 256); string x = Convert.ToString(Convert.ToInt64(numericIP / 65536) % 256); string y = Convert.ToString(Convert.ToInt64(numericIP / 256) % 256); string z = Convert.ToString(Convert.ToInt64(numericIP) % 256); return w + "." + x + "." + y + "." + z; } 

还有这个

 public static long GetNumericIP(string standardIP) { if (standardIP != null && standardIP != string.Empty) { string[] ipParts = standardIP.Split('.'); long numericIP = 16777216 * Convert.ToInt64(ipParts[0]) + 65536 * Convert.ToInt64(ipParts[1]) + 256 * Convert.ToInt32(ipParts[2]) + Convert.ToInt32(ipParts[3]); return numericIP; } return 0; } 

您可能希望通过检查参数来改进它们并使用string.concat

我非常不同意所提供的答案。 它肯定有效,但我可以看到它的严重问题,从可读性开始。 在我看来,可读性和可维护性是至关重要的,而公认的解决方案根本不会这样做。 除此之外,更通用的方法也将解决IPv6的问题,而接受的解决方案将无法工作。

我的建议是使用以下方法:

  public static IPAddress AddOne(this IPAddress ipAddress) { byte[] data = ipAddress.GetAddressBytes(); IncrementByOneFromRight(data, data.Length - 1); return new IPAddress(data); } private static void IncrementByOneFromRight(byte[] data, int index) { if (index < 0) return; if (data[index] < byte.MaxValue) data[index] += 1; else { data[index] = 0; IncrementByOneFromRight(data, index - 1); } } 

将上面的内容放在一个可见的静态类中,AddOne方法将作为IPAddress的扩展方法。 这使得它更容易使用,并且您不会暴露在您的类中添加到IPAddress的细节实现细节,同时保持和可读性。 这将带来额外的好处,不会使您已经使用可能不相关的方法编写的类混乱。

如果您同意我的答案以及我不同意批准的答案的原因,请立即投票,以便这些人能够看到这个问题。