2

.NET では、IPAddress.HostToNetworkOrder() は long int (64 ビット) のみを受け取り、long を返すことができます。これは IPv4 では問題ありませんが、IPv6 アドレスは 128 ビットです。IPv6アドレスを整数として保存する唯一の方法は、これを行うことです:

BigInteger big = new BigInteger(ip.GetAddressBytes());

BigInteger/IPv6 アドレスを使用してホスト オーダーからネットワーク オーダーに変換するにはどうすればよいですか?

4

2 に答える 2

2

IP アドレスをホスト バイト オーダーに変換する目的は、CPU の通常の整数型を使用して算術演算を実行できるようにすることです。たとえば、IPv4 では次のようになります。

network_base_address = address & (0xffffffff ^ ((1 << (32-prefix_length)) - 1)

IPv6 アドレスのサイズが大きく、CPU ネイティブ タイプがそれほど大きくないことから、IPv6 アドレスでこの種の演算が実行されるとは予想されていませんでした。

代わりに、16 バイトの配列として格納されている元の IP アドレス (ネットワーク バイト順) を操作できます。たとえば、C マクロIN_MULTICAST(IPv4 用) の通常の実装は、IP アドレスの整数値をビットマスクすることによって機能しますが、C マクロの通常の実装はIN6_IS_ADDR_MULTICAST、IP アドレスを整数として扱うのではなく、バイト配列で見つかった IP アドレスの最初のバイト。(この情報は C に関するものであり、あなたの質問は C# に関するものですが、同じ考えです)。

于 2013-06-10T20:13:53.843 に答える