2

IPV6アドレスには16バイトがあり、C ++に保存するデータ型ではないため、IPV6アドレスを保存し、IPv6アドレスと比較したかったので、その方法を教えてください

4

8 に答える 8

5

unsigned charCで行うように、それらをsのプレーンな配列として保存できます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() を使用すると、2 つの構造を比較できます。

Linux では、提案された標準は、sckedt in6_addr も呼び出し、上記と同じ方法で使用できます。詳細はこちら

于 2009-12-30T11:29:01.117 に答える
1

別のオプションは、== != [] などの演算子をオーバーライドできる独自の構造を定義することです。その内部では、16 文字の配列または x int の配列のように実装できます。これは、建築アーキテクチャに従って定義できます。 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

比較のために、独自の構造を定義する方が良いです.もう1つ、St​​dリストにIPを保存しています.オーバーロードされた演算子< ==関数を定義する必要がありました.

于 2009-12-30T11:23:34.883 に答える
0

それらを std::strings として保存します。その後、文字列比較演算子を使用できます。これらは、少なくとも等値/不等値のテストに関しては、null 文字が含まれていても問題にならないためです。リレーショナル テスト ( < 、 > など) の場合、 std::string のものはおそらくあなたが望むことをしないので、おそらく独自の関数を書きたいと思うでしょう。

于 2009-12-30T11:14:11.377 に答える
0

最近、かなり忙しいコードで同様の質問に対処しなければなりませんでした。私が使用した基本的な解決策は、理想とはほど遠いもので、いくつかの異なるデータ型で共用体を作成することでした。

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

少し風変わりですが、うまくいきました。2 つの IP を比較するには、64 ビット整数型 ip.ip64[0]==ip.ip64[0] && ip.ip64[1]=ip.ip64[1] で 2 つの比較が必要です。必要な比較をカバーするマクロ。

IPv6 を外部構造から直接コピーするには、ip8 メンバーで memcpy を使用するか、構造をポインターとしてキャストします。ip32 は、IPv4 相互運用操作 (IPv4 マップ IPv6 アドレス) などに役立つことがありました。

IPv6 配列は常にネットワーク バイト オーダーで格納されるため、同等以外のことを行う場合は、最初にホスト バイト オーダーに変換することを忘れないでください。

于 2010-02-14T08:02:23.257 に答える