由于 IPV6 地址有 16 个字节,并且它们不是在 c++ 中存储它的数据类型,我想存储 IPV6 地址,并与 IPv6 地址进行一些比较,请告诉我该怎么做
8 回答
您可以将它们存储为unsigned char
s 的普通数组,就像在 C 中所做的那样。unsigned char ipv6[16];
例如。然后,您可以使用任何数组比较算法来比较它们。使用char*
算法不是一个选项,因为您的 ipv6 地址的某些字节可能会被0x00
基于字符串的算法解释为字符串结尾字符。
创建 BYTE 数组的包装类来存储 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 }
};
另一种选择是定义您自己的结构,它可以覆盖 == != [] 等运算符,并且在它内部可以实现为 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 */}
};
将您的 IPV6 阵列存储在std::vector
. STL 向量已经包含运算符<
和==
。
最近不得不用相当繁忙的代码处理类似的问题。我使用的基本解决方案远非理想,是创建具有几种不同数据类型的联合:
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 数组始终以网络字节顺序存储。
将它们存储为 std::strings。然后,您可以使用字符串比较运算符,因为它们不会被包含的空字符所困扰,至少在相等/不等式测试方面。对于关系测试(<、> 等),您可能想要编写自己的函数,因为 std::string 可能不会执行您想要的操作。
为了比较定义自己的结构更好,我将ip存储在Std列表中的另一件事是我需要定义重载运算符< ==函数。所以如何定义<函数请提供任何线索