我将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亿行代码的合适解决方案?
答案 0 :(得分:6)
我认为这里的真正问题是你将原始形式视为一个字符串;特别是因为它是binary(4)
,所以你永远不应该这样做:只需从数据库中取回byte[]
。 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();
答案 1 :(得分:0)
public List<IPAddress> SubtractTwoIpAddresses(IPAddress a, IPAddress b, bool includeLeft = true, bool includeRight = true)
{
List<IPAddress> rv = new List<IPAddress>();
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;
}