将IP转换为字节/转换回字符串

我将SQLVERVER 2008数据库上的IPV4地址存储为二进制(4)。 所以,我在数据输入之前转换了这些值(并且由于公司的限制,我不能在数据库中创建函数,这不是讨论的问题)。

public static byte[] IpToBin(string ip) { return IPAddress.Parse(ip).GetAddressBytes(); } public static string HexToIp(string ip) { return new IPAddress(long.Parse(ip, NumberStyles.HexNumber)).ToString(); } 

调用IpToBin后,生成的数据为(例如0x59FC09F3)。 当我调用HexToIp时,ip反转可能是由于很少/大端转换。

任何人都可以提出一个没有500亿行代码的体面解决方案吗?

我认为这里的真正问题是你将原始forms视为一个字符串; 特别是因为它是binary(4) ,所以你永远不必这样做:只需将它作为byte[]从db中取回。 IpToBin很好,但HexToIp应该是:

 public static IPAddress BinToIp(byte[] bin) { return new IPAddress(bin); } 

然后:完成工作。 但是使用现有的HexToIp代码,您需要:

 return new IPAddress(new byte[] { Convert.ToByte(ip.Substring(0,2), 16), Convert.ToByte(ip.Substring(2,2), 16), Convert.ToByte(ip.Substring(4,2), 16), Convert.ToByte(ip.Substring(6,2), 16)} ).ToString(); 
  public List SubtractTwoIpAddresses(IPAddress a, IPAddress b, bool includeLeft = true, bool includeRight = true) { List rv = new List(); int ipA = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(IPAddress.Parse(a.ToString()).GetAddressBytes(), 0)), ipB = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(IPAddress.Parse(b.ToString()).GetAddressBytes(), 0)); if (includeLeft) rv.Add(new IPAddress(BitConverter.GetBytes(Math.Min(ipA, ipB)).Reverse().ToArray())); for (int i = 1; i < Math.Max(ipA, ipB) - Math.Min(ipA, ipB); i++) rv.Add(new IPAddress(BitConverter.GetBytes(Math.Min(ipA, ipB) + i).Reverse().ToArray())); if (includeRight) rv.Add(new IPAddress(BitConverter.GetBytes(Math.Max(ipA, ipB)).Reverse().ToArray())); return rv; }