web-dev-qa-db-ja.com

IPV6アドレスをIPV4アドレスに変換するにはどうすればよいですか?

私はIPv4アドレスを使用するアプリケーションを持っているので(それを長期間保存します)、IPv4アドレスのみを理解します。

Javaを使用してIPv6アドレスをIPv4に変換することは可能ですか?

12
newbie

IPv4アドレスの範囲には同等のIPv6があります ですが、すべてのIPv6アドレスをIPv4に変換することはできません。IPv4アドレスよりも多くのIPv6アドレスがあります。

この問題を回避する唯一の健全な方法は、IPv6アドレスを理解して保存できるようにアプリケーションを更新することです。

17
AllenJB

IPAddress Java library は、ここで説明していることを実行できます。

IPv6アドレスは16バイトです。そのライブラリを使用して、16バイトの配列から始める場合は、IPv6アドレスオブジェクトを作成できます。

IPv6Address addr = new IPv6Address(bytes); //bytes is byte[16]

そこから、アドレスがIPv4マップ、IPv4互換、IPv4変換などであるかどうかを確認できます(IPv6がIPv4アドレスを表す方法は多数あります)。ほとんどの場合、IPv6アドレスがIPv4アドレスを表す場合、ipv4アドレスは下位4バイトにあるため、次のようにして派生IPv4アドレスを取得できます。その後、バイトに戻すことができます。これはIPv4の場合はわずか4バイトです。

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

Javadocはリンクから入手できます。

4
Sean F

これは、JavaScriptで探しているコードです。すべてのipv6アドレスを変換できるわけではありません

<script>
function parseIp6(str)
{
  //init
  var ar=new Array;
  for(var i=0;i<8;i++)ar[i]=0;
  //check for trivial IPs
  if(str=="::")return ar;
  //parse
  var sar=str.split(':');
  var slen=sar.length;
  if(slen>8)slen=8;
  var j=0;
  for(var i=0;i<slen;i++){
    //this is a "::", switch to end-run mode
    if(i && sar[i]==""){j=9-slen+i;continue;}
    ar[j]=parseInt("0x0"+sar[i]);
    j++;
  }

  return ar;
}
function ipcnvfrom6(ip6)
{
  var ip6=parseIp6(ip6);
  var ip4=(ip6[6]>>8)+"."+(ip6[6]&0xff)+"."+(ip6[7]>>8)+"."+(ip6[7]&0xff);
  return ip4;
}
alert(ipcnvfrom6("::C0A8:4A07"));
</script>
2
Vishnuraj V

IPv4とIPv6のアドレス間(またはIPアドレスとデバイス間)は1-1で対応していないため、一般的に求めることはできません。

IPv4アドレス空間を実際に表す特定の範囲のIPv6アドレスがありますが、一般的なIPv6アドレスはこの範囲からのものではありません。

いくつかのグーグルは私を次の投稿に導きました:

http://www.developerweb.net/forum/showthread.php?t=3434

投稿で提供されているコードはCで記述されていますが、Javaに書き直すのはそれほど難しくないはずです。

1
aioobe