2009-12-30 849 views

回答

5

您可以像在C中一樣將它們存儲爲unsigned char的普通數組。例如,與unsigned char ipv6[16];一樣。然後你可以使用任何數組比較算法來比較它們。使用char*算法不會是一種選擇,因爲你的IPv6地址的一些字節可0x00,因此解釋爲終止基於字符串的字符的算法的字符串。

+2

或者已經有'operator =='的'boost :: array '。 – dalle 2009-12-30 11:35:51

0

並將其作爲標準::字符串。然後,您可以使用字符串比較運算符,因爲這些運算符不會被包含的空字符阻塞,至少在測試相等/不等時是如此。對於關係測試(<,>等),你可能會想寫自己的函數,因爲std :: string可能不會做你想要的。

1

另一種選擇是定義自己的結構,其可以覆蓋像運算符==!= [等]和內它可以像的16個字符陣列或x整數陣列來實現,可以根據建築結構,因爲你可以定義不知道int的大小。還可以定義用於獲取掩碼等的操作。這種方法允許位操作符的簡單使用。

編輯:

是否使用

std::list<MyIPStruct> iplist 

好嗎?

當您通過列表迭代你可以比較

iplist[i] < iplist[i+1] 

,如果我理解你的問題,你不知道如何重寫>操作?

struct MyIPStruct { 
    usigned char[16] bytes; // one option 
// unsigned int[16/sizeof(int)] bytes; // another option 

/* other methods... */ 

bool operator > (const MyIPStruct & ip2) { /* here is your code */} 
}; 
2

創建包裝類字節數組的存儲IPv6地址和過載[]操作符來訪問單個字節,你可以重載操作爲比較。

struct IPV6Address 
{ 
    unsigned char address[16]; 
    unsigned char operator [] (int i) ; // 
    bool operator == (const IPV6Address &ipv6) { //write you own logic } 
    bool operator < (const IPV6Address &ipv6) { //write you own logic } 
}; 
0

爲comparisions定義自己的結構比較好,還有一兩件事我很存儲在標準列表中的IP是我需要定義重載操作< == functions.so如何定義<功能任何線索,請

3

您不指定使用的平臺或IP堆棧。在窗口上,IPV6地址被存儲在結構調用in6_addr中。在這個結構中,你有地址的u_char字節[16]。並使用std :: memcmp()你可以比較兩個結構。

Linux上的建議標準又撥打了struckt in6_addr並且可以在與上述相同的方式使用。更多信息here

0

最近不得不面對具有相當忙碼similiar問題。很不理想我使用的基本解決方案是創建一個聯盟與幾個不同的數據類型:

typedef union myip 
{ 
unsigned char ip8[16]; 
unsigned int ip32[4]; 
unsigned long long ip64[2]; 
}; 

它是一個有點古怪,但結果不錯。要比較兩個IP,只需要在64位整數類型ip.ip64 [0] == ip上進行兩次比較。ip64 [0] & & ip.ip64 [1] = ip.ip64 [1]然後只需添加一些基本功能/宏來覆蓋所需的比較。

要直接從外部結構中複製IPv6,可以在ip8成員上使用memcpy或將結構強制轉換爲指針。 ip32有時可用於IPv4互操作(IPv4映射的IPv6地址)..等等。

如果除了等號之外的任何操作,請記住首先轉換爲主機字節順序,因爲IPv6數組總是以網絡字節順序存儲。

1

將您的IPV6陣列存儲在std::vector中。 STL載體已經包含運營商<==

+0

boost :: array可能更高效(請參閱其他評論) – unixman83 2010-12-15 23:04:31