プレフィックスマスクを表すIPv6アドレスを整数に変換するためのCコードは何でしょうか。
たとえば、次のIPv6アドレスプレフィックスマスク:FFFF:FFFF:FFFF:FFFF:0000:0000:0000:0000
64に変換されます
ありがとう
これをsockaddr_in6からintに変更する必要があります
ビット数を見つける最良の方法は、それらを決して忘れないことです。IPv6では、ビットマスクをアドレス/ビット方式で指定する必要があるため、ビットを記録して保持します。
そうでない場合、これはビットカウントの問題です。ビットはすべて最初にある必要があるので、一度にワードサイズのビットをチェックすることによってそれにアプローチしようとします。ワードサイズはおそらく32または64です。等しくなくなったら、-1UL
ハーフワードサイズ、クォーターワードサイズ、および1バイトを確認します。最後のバイトには256アイテムのルックアップテーブルを使用します。
これを非常に迅速に行うには、おそらくいくつかのひどくクールなビットをいじる方法があります。自分で調べなければなりません。
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、本当に:あなたは本当に実用的な答えを受け入れるべきです!ある日、人々はあなたを助けることをまったく拒否するでしょう。