IPV6アドレスには16バイトがあり、C ++に保存するデータ型ではないため、IPV6アドレスを保存し、IPv6アドレスと比較したかったので、その方法を教えてください
8 に答える
unsigned char
Cで行うように、それらをsのプレーンな配列として保存できますunsigned char ipv6[16];
。たとえば。次に、そこにある配列比較アルゴリズムを使用してそれらを比較できます。char*
IPv6アドレスの一部のバイトが0x00
文字列ベースのアルゴリズムによって文字列終了文字として解釈される可能性があるため、アルゴリズムを使用することはできません。
別のオプションは、== != [] などの演算子をオーバーライドできる独自の構造を定義することです。その内部では、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 */}
};
IPV6 アレイを に保管しstd::vector
ます。STL ベクトルには既に演算子<
とが含まれています==
。
比較のために、独自の構造を定義する方が良いです.もう1つ、StdリストにIPを保存しています.オーバーロードされた演算子< ==関数を定義する必要がありました.
それらを std::strings として保存します。その後、文字列比較演算子を使用できます。これらは、少なくとも等値/不等値のテストに関しては、null 文字が含まれていても問題にならないためです。リレーショナル テスト ( < 、 > など) の場合、 std::string のものはおそらくあなたが望むことをしないので、おそらく独自の関数を書きたいと思うでしょう。
最近、かなり忙しいコードで同様の質問に対処しなければなりませんでした。私が使用した基本的な解決策は、理想とはほど遠いもので、いくつかの異なるデータ型で共用体を作成することでした。
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 配列は常にネットワーク バイト オーダーで格納されるため、同等以外のことを行う場合は、最初にホスト バイト オーダーに変換することを忘れないでください。