6

IPV4アドレスをSQLSERVER2008データベースに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が逆になりました。

誰かが500億行のコードなしでまともな解決策を考え出すことができますか?

4

2 に答える 2

6

ここでの本当の問題は、生のフォームを文字列として扱っていることだと思います。特にそれがそうであるのでbinary(4)、あなたはそれをする必要は決してないはずです:ただそれをdbからフェッチして戻すだけ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(); 
于 2013-01-24T10:55:34.283 に答える
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;
    }
于 2014-04-04T16:50:28.820 に答える