2

プレフィックスマスクを表すIPv6アドレスを整数に変換するためのCコードは何でしょうか。

たとえば、次のIPv6アドレスプレフィックスマスク:FFFF:FFFF:FFFF:FFFF:0000:0000:0000:0000

64に変換されます

ありがとう

これをsockaddr_in6からintに変更する必要があります

4

2 に答える 2

3

ビット数を見つける最良の方法は、それらを決して忘れないことです。IPv6では、ビットマスクをアドレス/ビット方式で指定する必要があるため、ビットを記録して保持します。

そうでない場合、これはビットカウントの問題です。ビットはすべて最初にある必要があるので、一度にワードサイズのビットをチェックすることによってそれにアプローチしようとします。ワードサイズはおそらく32または64です。等しくなくなったら、-1ULハーフワードサイズ、クォーターワードサイズ、および1バイトを確認します。最後のバイトには256アイテムのルックアップテーブルを使用します。

これを非常に迅速に行うには、おそらくいくつかのひどくクールなビットをいじる方法があります。自分で調べなければなりません。

于 2012-05-25T04:04:14.453 に答える
3

struct in6_addr私のアプローチはZanに関連していますが、に含まれるastruct sockaddr_in6は本質的に16文字の配列であるという事実に対処しています。

したがって、値が見つかるまでバイトを反復処理する必要があります!= 0xFF

int bits = 0;
struct in6_addr * addr = &((struct sockaddr_in6 *)ai_addr)->sin6_addr;
for (i=0; i<16; i++) {
    if (addr->s6_addr[i] == '\xFF') {
        bits += 8;
    } else {
        case (addr->s6_addr[i]) {
            '\xFE': bits += 7; break;
            '\xFC': bits += 6; break;
            '\xF8': bits += 5; break;
            '\xF0': bits += 4; break;
            '\xE0': bits += 3; break;
            '\xC0': bits += 2; break;
            '\x80': bits += 1; break;
            '\x00': bits += 0; break;
            default: complain();
        }
        break;
    }
}

しかし、Zanが書いているように、必要に応じて、マスクを生成するためにすでに持っている数を維持する方がよいでしょう。その逆ではありません。

しかし、@ SamuelChampagne、本当に:あなたは本当に実用的な答えを受け入れるべきです!ある日、人々はあなたを助けることをまったく拒否するでしょう。

于 2012-05-25T08:22:37.650 に答える