当前位置: 首页 > 编程语言 > C#

ip地址自增问题分享

时间:2023-04-10 12:33:59 C#

ip地??址自增问题我想增加我的IP地址;这是代码ipAddressControl1.Text="192.168.1.255";byte[]ip=ipAddressControl1.GetAddressBytes();ip[3]=(byte)(++ip[3]);IPAddressipAddress1=newIPAddress(ip);MessageBox.Show(ipAddress1.ToString());或者我也试过这个ipAddressControl3.Text="192.168.1.255";IPAddressipAddress1=newIPAddress(?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);如果(ip[3]==0){ip[2]=(字节)(ip[2]+1);如果(ip[2]==0){ip[1]=(byte)(ip[1]+1);如果(ip[1]==0){ip[0]=(字节)(ip[0]+1);以下可能也有效:byte[]ip=ipAddressControl1.GetAddressBytes();如果(++ip[3]==0)如果(++ip[2]==0)如果(++ip[1]==0)++ip[0];值得注意的是,现有的None答案都处理IPAddress类本身确实需要的IPv6地址。为此,您可能希望采用更通用的策略(我不确定IPv6的增量规则是什么样的,尽管它们可能完全相同,只是需要更多字节来完成,我怀疑这是案件)。--编辑:基于此,这似乎可行:publicstaticIPAddressIncrement(IPAddressaddress){IPAddressresult;byte[]bytes=address.GetAddressBytes();for(intk=bytes.Length-1;k>=0;k--){if(bytes[k]==byte.MaxValue){bytes[k]=0;继续;}bytes[k]++;结果=新的IP地址(字节);返回结果;}//不可自增,返回原地址。退货地址;在第一个示例中,您只是递增第4个字节序列。所以它会从255变为0,对byte[2]没有影响。在第二个序列中,您将其递增1,然后将其从2切换回1。我不确定您为什么选择这样做。您需要检查您的地址是否为254-255并且0是广播地址。ipAddressControl1.Text="192.168.1.255";byte[]ip=ipAddressControl1.GetAddressBytes();如果(ip[3]!=255){ip[3]=(byte)(++ip[3]);}else{ip[2]=(byte)(++ip[2]);ip[3]=(byte)0;}IPAddressipAddress1=newIPAddress(ip);MessageBox.Show(ipAddress1.ToString());但是你只能检查ip[0]以内的溢出-如果你在那里点击255,你需要小心。看起来IP地址以“错误的方式”存储在您尝试使用的.Address属性中:192.168.1.255c0a801ff存储为0xff01a8c0所以添加1只是在左侧添加0xff,然后截断它,将其变为0。如果您希望它按照您描述的方式工作,则必须编写自己的附加功能。publicstaticIPAddressIncrementIP(IPAddressaddr){byte[]ip=addr.GetAddressBytes();ip[3]++;如果(ip[3]==0){ip[2]++;如果(ip[2]==0){ip[1]++;如果(ip[1]==0)ip[0]++;}}返回新的IP地址(ip);}或类似的东西。您可以将IP转换为其等效的数字。有关详细信息,请参阅之前回答的问题:BesttypeofIPaddressinHibernateEntity?publicstaticstringGetStandardIP(longnumericIP){stringw=Convert.ToString(Convert.ToInt64(numericIP/16777216)%256);字符串x=Convert.ToString(Convert.ToInt64(numericIP/65536)%256);字符串y=Convert.ToString(Convert.ToInt64(numericIP/256)%256);字符串z=Convert.ToString(Convert.ToInt64(numericIP)%256);返回w+"."+x+"."+y+"."+z;}而这个publicstaticlongGetNumericIP(stringstandardIP){if(standardIP!=null&&standardIP!=string.Empty){string[]ipParts=standardIP.Split('.');longnumericIP=16777216*Convert.ToInt64(ipParts[0])+65536*Convert.ToInt64(ipParts[1])+256*Convert.ToInt32(ipParts[2])+Convert.ToInt32(ipParts[3]);返回数字IP;}返回0;您可能想通过检查参数和使用string.concat来改进它们我强烈不同意所提供的答案。它确实有效,但我可以看到它的严重问题,从可读性开始。在我看来,可读性和可维护性是至关重要的,而公认的解决方案根本做不到。除此之外,更通用的方法还将解决IPv6的问题,在这些问题中,公认的解决方案将不起作用。我的建议是使用以下方法:publicstaticIPAddressAddOne(thisIPAddressipAddress){byte[]data=ipAddress.GetAddressBytes();IncrementByOneFromRight(数据,数据。长度-1);返回新的IP地址(数据);}privatestaticvoidIncrementByOneFromRight(byte[]data,intindex){if(index将上面的放在一个可见的静态类中,AddOne方法就是IPAddress的一个扩展方法,这样用起来更方便,不会被暴露给您的课程在保持和可读性的同时增加了IPAddress的实现细节。这将带来额外的好处,即不会使您已经使用可能不相关的方法编写的类变得混乱。如果您也同意我的回答原因为什么我不同意通过的答案,请现在投票,让这些人看到这个问题。以上就是C#学习教程的全部内容:ip地址自增问题分享,如果对大家有用,还需要进一步了解C#学习教程,希望大家多多关注---本文采集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如有转载,请注明出处: