web-dev-qa-db-ja.com

アドレスをIPv4からIPv6に変換する方法

これは可能ですか?どのようにしてipv4をipv6アドレスに変換できますか?

ここからのいくつかの例:

0.0.0.0   -> ::
127.0.0.1 -> ::1

Javaでソリューションを検索しています。

おかげで、

22
Chris

意味のあるIPv4からIPv6へのマッピングはありません。 0.0.0.0や127.0.0.1のようなものは仕様では特殊なケースであるため、同等の意味があります。しかし、IPv4アドレスを指定すると、特定のIPv6アドレスがどうなるかについては何もわかりません。 DNSルックアップを使用して、特定のIPアドレスがホストに解決され、ホストがIPv4アドレスに加えてIPv6アドレスに解決されるかどうかを確認できますが、DNSサーバーは、特定のマシンでそれをサポートするように構成する必要があります。

30
Yishai

ハイブリッドデュアルスタックIPv6/IPv4実装は、通常、特別なクラスのアドレスであるIPv4マップアドレスをサポートします。詳細については、次のリンクを確認してください。

http://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses

IPv4をマップされたIPv6に変換するには、以下を使用できます。

String ip = "127.0.0.1"; 
String[] octets = ip.split("\\.");
byte[] octetBytes = new byte[4];
 for (int i = 0; i < 4; ++i) {
            octetBytes[i] = (byte) Integer.parseInt(octets[i]);
}

byte ipv4asIpV6addr[] = new byte[16];
ipv4asIpV6addr[10] = (byte)0xff;
ipv4asIpV6addr[11] = (byte)0xff;
ipv4asIpV6addr[12] = octetBytes[0];
ipv4asIpV6addr[13] = octetBytes[1];
ipv4asIpV6addr[14] = octetBytes[2];
ipv4asIpV6addr[15] = octetBytes[3];

またチェック this

19
Deep

以前は、IPv4アドレス用にIPv6で予約されたアドレススペースがあり、IPv4アドレスの前に単に0ビットの96を付けました。例えば。 192.168.10.13 -> ::C0A8:0A0D。私が知っているように、これは廃止されており、直接利用できる変換はもうありません。

5
Zed

IPv6はIPv4互換です。

IPv4アドレス:例192.168.99.1

ステップ1>

最初のオクテット(192)を16で割ります(16進数は16進なので)IE:192/16 = 12回正確に0を残します– Hexの12はC – 0として表されます(ゼロ)16進数では、あなたはそれを推測した、0したがって、16進数で192はC

ステップ2>

2番目のオクテット(168)を使用して手順1を繰り返します。IE:10 * 6 = 160であるため、168/16 = 10が残り、10である– 10はHEXである– 8はHEXである8したがって、16進数の168はA8です。

ステップ3>

繰り返しルール!!! 3番目のオクテット(99)IE:99/16 = 3が残っている状態で6回– HEXの6は6 – HEXの3は3したがって、HEXの99は6 =

ステップ4>

最後のオクテットIE:1/16 = 0回、1が残っている– 0はHEXで、そうです0 – 1がHEXで1なので、1がHEXである1

したがって、IPv6アドレス部分で表される192.168.99.1のIPv4アドレスはC0A8:6301になります。ただし、小文字を使用し、不足しているバイトIPv6をすべて追加する必要があるため、正しいコードは次のとおりです。

:: c0a8:6301

または、常に受け入れられる構文を使用できます。

:: 192.168.99.1

したがって、最終的にIPv6アドレスは、古いアドレスの前に::文字が付いた古いアドレスになる可能性があります。

3
MaxV

IPv4をIPv6にマッピングする方法は多数あります。このようなほとんどの方法では、変換されたIPv4アドレスは、16バイトのIPv6アドレスの下位4バイトに配置されます。

IPAddress Java library には、IPv4をIPv6に変換する最も一般的な方法の多くを支援するメソッドがあります。免責事項:私はそのライブラリのプロジェクトマネージャーです。

たとえば、IPv4アドレスを指定すると、IPv6マッピング変換を使用して、次のようにIPv6に変換できます。

IPv6Address ipv6Address = new IPAddressString("1.2.3.4").getAddress().toIPv4().
    getIPv4MappedAddress();
System.out.println(ipv6Address); // ::ffff:102:304
System.out.println(ipv6Address.toMixedString()); // ::ffff:1.2.3.4

IPv6Addressインスタンスを使用すると、アドレスがIPv4マップ、IPv4互換、IPv4変換などであるかどうかを確認できます(これらは、IPv6がIPv4アドレスを表す多くの可能な方法の一部です)。その後、IPv4に戻すことができます。

if(addr.isIPv4Compatible() || addr.isIPv4Mapped()) {
    IPv4Address derivedIpv4Address = ipv6Address.getEmbeddedIPv4Address();
    byte ipv4Bytes[] = ipv4Address.getBytes();
    ...
 }
2
Sean F