Ipv4
對 IPv4 地址進行排序
所以我在排序 IPv4 地址時遇到了難題,不知道在一些晦澀難懂的網路文件中是否有固定規則。我是否只對原始地址進行直接排序(例如將 IP 地址轉換為 32 位數字然後排序),我是否通過一些數學公式將 CIDR 考慮在內,我是否僅通過 CIDR 排序(好像我’ m 比較網路大小而不是直接比較地址)?
即,正常的數學,我們會做一些類似
-1 < 0 < 1
表示優先順序的事情。假設 ,10.1.0.0/16
,172.16.0.0/12
,192.168.1.0/24
和192.168.1.42
, 優先順序是什麼?
上次我這樣做時,我大致是這樣實現的(為了清楚起見,省略了驗證和錯誤檢查):
(addressA, maskA) = split('/', a); (addressB, maskB) = split('/', b); ipCmp = inet_aton(addressB) - inet_aton(addressA); if (ipCmp > 0) { return -1; } else if (ipCmp < 0) { return 1; } else { if (maskA < maskB) { return 1; } else if (maskA > maskB) { return -1; } else { return 0; } }
給定輸入數組
{ 10.0.1.0/24, 10.0.0.0/24, 10.0.0.0/8 }
,這應該產生{ 10.0.0.0/8, 10.0.0.0/24, 10.0.1.0/24 }
.編輯補充:我知道沒有“普遍接受”的方法,以上只是對我必須完成的任務最有用的方法。使用 inet_aton 的原因是 IP 地址只是格式稍有不同的整數。將它們作為整數進行比較,您將獲得有用的排序。