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

本文关键字:转换 字符串 IP 字节 | 更新日期: 2023-09-27 17:55:32

>我将 IPV4 地址作为 Binary(4) 存储在 SQLSERVER 2008 数据库中。因此,我在数据输入之前转换值(由于公司限制,我无法在数据库内创建函数,这无关紧要讨论)。

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 亿行代码的情况下提出一个像样的解决方案吗?

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

我认为这里真正的问题是您将原始形式视为字符串; 特别是因为它是 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(); 
    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;
    }