我想增加我的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的价值
答案 0 :(得分:8)
您的问题是,当ip[2]
回绕时,您不会增加ip[3]
(依此类推)。以下代码应该可以解决问题,最后从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];
答案 1 :(得分:2)
值得注意的是,现有的答案都没有处理IPv6地址,IPAddress类本身确实需要这些地址。为此,您可能希望采用更一般的策略(我不确定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;
}
答案 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就需要小心。
答案 3 :(得分:1)
在第一个示例中,您只是递增第4个字节序列。因此它将从255变为0而对字节[2]没有影响。
在第二个序列中,你将它递增1,然后你将它从2转换回1.我不确定你为什么选择这样做。
答案 4 :(得分:0)
看起来IP地址在您尝试使用的.Address
属性中以“错误的方式”存储:
192.168.1.255
c0 a8 01 ff is stored as 0xff01a8c0
因此,添加1 << 24
只会增加左侧的0xff
,然后将其截断,并将其转换为0
。
如果您希望按照您描述的方式工作,则必须编写自己的附加功能。
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);
}
或类似的东西。
答案 5 :(得分:0)
您可以将IP转换为其等效数字。
查看此前已回答的问题以获取详细信息:
Best type for IP-address in Hibernate Entity?
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
答案 6 :(得分:0)
我强烈不同意所提供的答案。它肯定有效,但我可以看到它的严重问题,从可读性开始。在我看来,可读性和可维护性是至关重要的,并且接受的解决方案根本不会这样做。除此之外,更通用的方法也将解决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的细节实现细节,同时保持和可读性。这将带来额外的好处,即不会使用可能不相关的方法编写的类混乱。
如果您同意我的回答以及我不同意批准的原因,请立即投票通知这个问题。