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

6

我将一个IPV4地址存储在SQLSERVER 2008数据库中,使用Binary(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地址可能会反转,这可能是由于小/大端转换引起的。
请问是否有任何简洁的解决方案,而不需要写50亿行代码?

如何将IPv6地址存储在4个字节中? - dtb
1
你正在编写不支持IPv6的2013年新代码?这就像在1999年编写仅支持日期中2位数字年份的新代码一样。 [Y2K] (http://en.wikipedia.org/wiki/Year_2000_problem) - dtb
3
有趣的是人们喜欢在不知道代码是什么的情况下就加入其中。在那个应用程序上我根本不需要IPV6。 - Alexandre
2个回答

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(); 

实际上,如果我从数据库返回字节数组,我肯定应该遵循您的指南,不使用原始十六进制,而是使用byte[]。谢谢! - Alexandre

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;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接