2009-12-30 28 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