由于IPV6地址有16个字节,并且它们不是用c ++存储的数据类型, 我想存储IPV6地址,并对IPv6地址进行一些比较, 请让我知道怎么做
答案 0 :(得分:5)
您可以将它们存储为unsigned char
的普通数组,就像在C中一样。例如,unsigned char ipv6[16];
。然后你可以使用任何数组比较算法比较它们。使用char*
算法不是一种选择,因为ipv6地址的某些字节可能是0x00
,因此可以通过基于字符串的算法解释为字符串结尾字符。
答案 1 :(得分:3)
您没有指定正在使用的平台或IP堆栈。在Windows上,IPV6地址存储在结构调用in6_addr中。在该结构中,您有u_char Byte [16]作为地址。使用std :: memcmp()可以比较两种结构。
在linux上,建议的标准也调用了in_addr中的struckt,并且可以像上面一样使用。更多信息here。
答案 2 :(得分:2)
创建BYTE数组的包装类来存储ipv6地址和overload []运算符来访问单个字节,你可以重载运算符进行比较。
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 }
};
答案 3 :(得分:1)
另一种选择是定义你自己的结构,它可以覆盖像==!= []等运算符。在里面它可以实现像16个字符的数组或x个int的数组,可以根据建筑结构来定义,因为你不要不知道int的大小。还可以定义用于获取掩码等的操作。该方法允许容易地使用位操作符。
编辑:
您使用的是
吗? std::list<MyIPStruct> iplist
好吗?
当您遍历列表时,您可以进行比较
iplist[i] < iplist[i+1]
如果我理解了你的问题,你就不知道怎么覆盖&gt;操作
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 */}
};
答案 4 :(得分:1)
将您的IPV6阵列存储在std::vector
中。 STL向量已包含运算符<
和==
。
答案 5 :(得分:0)
将它们存储为std :: strings。然后,您可以使用字符串比较运算符,因为这些运算符不会被包含的空字符所欺骗,至少对于相等/不等式的测试而言。对于关系测试(&lt;,&gt;等),您可能希望编写自己的函数,因为std :: string可能不会执行您想要的操作。
答案 6 :(得分:0)
用于比较定义自己的结构是更好的,还有一件事我将ip存储在Std列表中我需要定义重载的运算符&lt; == functions.so如何定义&lt;请发表任何线索
答案 7 :(得分:0)
最近不得不用相当繁忙的代码来处理类似的问题。远非理想,我使用的基本解决方案是创建一个具有多种不同数据类型的联合:
typedef union myip
{
unsigned char ip8[16];
unsigned int ip32[4];
unsigned long long ip64[2];
};
它有点古怪但很好用。要比较两个IP,只需要在64位整数类型上进行两次比较ip.ip64 [0] == ip.ip64 [0]&amp;&amp; ip.ip64 [1] = ip.ip64 [1]然后只需添加一些基本功能/宏来覆盖所需的比较。
要直接从外部结构复制IPv6,可以在ip8成员上使用memcpy或将结构转换为指针。 ip32有时对IPv4互操作操作有用(IPv4映射的IPv6地址)..等等。
如果除了相等之外的任何事情,请记住首先转换为主机字节顺序,因为IPv6数组始终以网络字节顺序存储。