私はIPv4
アドレスを使用するアプリケーションを持っているので(それを長期間保存します)、IPv4
アドレスのみを理解します。
Java
を使用してIPv6
アドレスをIPv4
に変換することは可能ですか?
IPv4アドレスの範囲には同等のIPv6があります ですが、すべてのIPv6アドレスをIPv4に変換することはできません。IPv4アドレスよりも多くのIPv6アドレスがあります。
この問題を回避する唯一の健全な方法は、IPv6アドレスを理解して保存できるようにアプリケーションを更新することです。
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はリンクから入手できます。
これは、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>
IPv4とIPv6のアドレス間(またはIPアドレスとデバイス間)は1-1で対応していないため、一般的に求めることはできません。
IPv4アドレス空間を実際に表す特定の範囲のIPv6アドレスがありますが、一般的なIPv6アドレスはこの範囲からのものではありません。
いくつかのグーグルは私を次の投稿に導きました:
http://www.developerweb.net/forum/showthread.php?t=3434
投稿で提供されているコードはCで記述されていますが、Javaに書き直すのはそれほど難しくないはずです。