2

由于 IPV6 地址有 16 个字节,并且它们不是在 c++ 中存储它的数据类型,我想存储 IPV6 地址,并与 IPv6 地址进行一些比较,请告诉我该怎么做

4

8 回答 8

5

您可以将它们存储为unsigned chars 的普通数组,就像在 C 中所做的那样。unsigned char ipv6[16];例如。然后,您可以使用任何数组比较算法来比较它们。使用char*算法不是一个选项,因为您的 ipv6 地址的某些字节可能会被0x00基于字符串的算法解释为字符串结尾字符。

于 2009-12-30T11:07:54.713 回答
3

您无需指定正在使用的平台或 IP 堆栈。在 Windows 上,IPV6 地址存储在结构调用in6_addr中。在该结构中,您有 u_char Byte[16] 作为地址。并且使用 std::memcmp() 您可以比较两个结构。

在 linux 上,提议的标准也调用了该标准 in6_addr 并且可以以与上述相同的方式使用。更多信息在这里

于 2009-12-30T11:29:01.117 回答
2

创建 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 }
};
于 2009-12-30T11:21:08.647 回答
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 */}
};
于 2009-12-30T11:15:12.950 回答
1

将您的 IPV6 阵列存储在std::vector. STL 向量已经包含运算符<==

于 2010-02-14T08:23:56.497 回答
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] && ip.ip64[1]=ip.ip64[1] 进行两次比较,然后添加一些基本功能/涵盖所需比较的宏。

要直接从外部结构复制 IPv6,您可以在 ip8 成员上使用 memcpy 或将结构转换为指针。ip32 有时可用于 IPv4 互操作操作(IPv4 映射的 IPv6 地址)..等。

如果您执行除相等之外的任何操作,请记住首先转换为主机字节顺序,因为 IPv6 数组始终以网络字节顺序存储。

于 2010-02-14T08:02:23.257 回答
0

将它们存储为 std::strings。然后,您可以使用字符串比较运算符,因为它们不会被包含的空字符所困扰,至少在相等/不等式测试方面。对于关系测试(<、> 等),您可能想要编写自己的函数,因为 std::string 可能不会执行您想要的操作。

于 2009-12-30T11:14:11.377 回答
0

为了比较定义自己的结构更好,我将ip存储在Std列表中的另一件事是我需要定义重载运算符< ==函数。所以如何定义<函数请提供任何线索

于 2009-12-30T11:23:34.883 回答