在網路應用中,常需根據 IP 位址判斷所屬區段(如城市、ISP、公司內部網段)。本文提供完整 C# 實作,核心在於將 IPv4 位址轉換為 ulong 整數,透過數值區間比對快速定位,適用於 IP 地理資訊、存取控制、流量分析等場景。
IPv4 位址為 32 位元(4 位元組),例如 219.148.24.0。將其視為大端序(Big-Endian)無號整數:
219 × 256³ + 148 × 256² + 24 × 256¹ + 0 × 256⁰ = 3,681,203,200
轉換演算法:
public static ulong IP2A(string ip)
{
byte[] bytes = IPAddress.Parse(ip).GetAddressBytes(); // 取得 4 位元組
ulong ret = 0;
foreach (byte b in bytes)
{
ret <<= 8; // 左移 8 位(乘 256)
ret |= b; // 加上目前位元組
}
return ret;
}
關鍵細節:IPAddress.Address 屬性回傳的是有號長整數(可能為負),且位元組序可能不同,不可直接使用,必須自行轉換。
public class IPRange
{
public string Name { get; set; } // 區段名稱(如「石家莊」)
public ulong BeginIP { get; set; } // 起始 IP(數值)
public ulong EndIP { get; set; } // 結束 IP(數值)
public ulong Range => EndIP - BeginIP; // 區段大小
public IPRange(string name, string ipBegin, string ipEnd)
{
Name = name;
BeginIP = IP2A(ipBegin);
EndIP = IP2A(ipEnd);
}
// 靜態比較器:依區段大小排序(大區段優先或依需求調整)
public static int Compare(IPRange x, IPRange y)
{
if (x.Range == y.Range) return 0;
return x.Range > y.Range ? 1 : -1;
}
}
public class IPRangeManage
{
private List _list = new List();
private bool _needSort = true;
public void Add(IPRange range)
{
_list.Add(range);
_needSort = true; // 標記需重新排序
}
private void Sort()
{
if (_needSort)
{
_list.Sort(IPRange.Compare);
_needSort = false;
}
}
public IPRange Search(string ipString)
{
ulong ip = IPRange.IP2A(ipString);
Sort(); // 確保已排序
foreach (var range in _list)
{
if (range.BeginIP <= ip && range.EndIP >= ip)
return range; // 找到符合區段
}
return null; // 無匹配
}
}
static void Main()
{
var manager = new IPRangeManage();
// 新增區段(名稱、起始IP、結束IP)
manager.Add(new IPRange("石家莊", "219.148.24.0", "219.148.63.255"));
manager.Add(new IPRange("石家莊", "222.222.0.0", "222.222.63.255"));
manager.Add(new IPRange("唐山", "219.148.64.0", "219.148.79.255"));
manager.Add(new IPRange("保定", "219.148.20.0", "219.148.23.255"));
// 查詢
var result = manager.Search("219.148.56.3");
Console.WriteLine(result?.Name ?? "未找到"); // 輸出:石家莊
}
foreach 改為二分搜尋,複雜度從 O(n) 降為 O(log n)System.Numerics.BigInteger(128 位元)儲存 IPv6ImmutableList將 IP 位址轉為數值進行區間比對,是高效率 IP 定位的核心技巧。本文提供的 IPRange 與 IPRangeManage 類別結構清晰、易於擴展,可直接整合至專案中使用。