※ゴミが付いたので削除&再投稿
とりあえず、正常系?っぽいIpv6のみに対応するものを作ってみました。
ちゃんとしたものはrfc読むか、JavaにあるIpv6用のクラスと併用して使うべきかも。
ちなみにここのソースコードにあるメソッドの中には、前回書いたIpv4用のメソッドを呼んでいる
箇所もあるのであしからず。
public static byte getIpv6AddressOfByte(String ip6addr) { byte bys = null; String spnodes = ip6addr.split(COLLON); if(spnodes.length == IPV6OCTETS) { bys = encodeIpv6FullOctet(spnodes); }else if(spnodes.length == IPV6OCTETS_CONTAINIPV4) { bys = encodeIpv6FullOctetContainsIpv4(spnodes); } return bys; } public static String getIpv6AddressOfStr(byte ip6bytes, String type) { String strs = null; if(IPv6.equals(type)) { strs = decodeIpv6FullOctet(ip6bytes); }else if(IPv6_CONTAINIPv4.equals(type)) { strs = decodeIpv6FullOctetContainsIpv4(ip6bytes); } return strs; } /** * ipv6のバイト配列からipv6文字列を作成するメソッド * @param ip6bytes ipv6のバイト配列 * @param ispullZerp オクテット0を抜くか否か * @return */ public static String getIpv6AddressOfStr(byte ip6bytes, boolean ispullZerp) { String str = null; if(ispullZerp) { str = getIpv6AddressPullZero(ip6bytes); }else { str = getIpv6AddressFullZero(ip6bytes); } return str; } private static final String IPv6 = "IPv6"; private static final String IPv6_CONTAINIPv4 = "IPv6_CONTAINIPv4"; /** ::FFFF: */ private static final String IPV6_HEADER_F = "::FFFF:"; /** : */ private static final String IPV6_HEADER_C = ":"; /** * IPv4アドレスをIPv6形式に変換する * @param addr ipv4のバイト配列 * @param ipv6header 先頭部分の形 * @return IPv6型IPv4文字列 */ public static String changeIpv4TpIpv6(byte addr, String ipv6header) { String ipv4str = createIpv4StrBasic(revisionIp4addressOfInt(addr)); StringBuffer buf = new StringBuffer(); return buf.append(ipv6header) .append(ipv4str) .toString(); } /** * ipv6のオクテット配列をバイト配列に変換するメソッド. * 最後のオクテットがIPv4となっている特殊な場合に使用(x:x:x:x:x:x:d.d.d.d xは16bit,dは8bit) * * @param spnodes ipv4混合オクテット配列 * @return バイト配列 */ public static byte encodeIpv6FullOctetContainsIpv4(String spnodes) { if(spnodes.length != IPV6OCTETS_CONTAINIPV4) { return null; } byte ipv6octsbyte = new byte[IPV6OCTETS_BYTE]; int count = 0; for(int i=0;innodes = spnodes[i].toCharArray(); byte octb = createIpv6OneNodeOfBytes(nnodes); ipv6octsbyte[count++] = octb[0]; ipv6octsbyte[count++] = octb[1]; }else { byte ipv4b = getIp4addressOfByte(separateIpv4Basic(spnodes[i])); ipv6octsbyte[count++] = ipv4b[0]; ipv6octsbyte[count++] = ipv4b[1]; ipv6octsbyte[count++] = ipv4b[2]; ipv6octsbyte[count++] = ipv4b[3]; } } return ipv6octsbyte; } /** * ipv6のオクテット配列をバイト配列に変換するメソッド * @param spnodes オクテット配列 * @return バイト配列 */ public static byte encodeIpv6FullOctet(String spnodes) { if(spnodes.length != IPV6OCTETS) { return null; } byte ipv6octsbyte = new byte[IPV6OCTETS_BYTE]; int count = 0; for(int i=0;i nnodes = spnodes[i].toCharArray(); byte octb = createIpv6OneNodeOfBytes(nnodes); ipv6octsbyte[count++] = octb[0]; ipv6octsbyte[count++] = octb[1]; } return ipv6octsbyte; } /** * IPv6の1オクテットをキャラに分解したものを引数とし、1オクテットを2byteデータに変換するメソッド。 * @param nnodes 1つのオクテットをキャラに分割したもの * @return 1つのオクテットを2byteで表現したもの[0]は上位1バイト、[1]は下位1バイトを含む */ public static byte createIpv6OneNodeOfBytes(char nocts) { byte nodebytes = new byte[2]; switch(nocts.length) { case 1://1つ揃い d=(000d) nodebytes[0] = (byte)0; nodebytes[1] = createByteToChars('0',nocts[0]); break; case 2://2つ揃い bb=(00bb) nodebytes[0] = (byte)0; nodebytes[1] = createByteToChars(nocts[0],nocts[1]); break; case 3://3つ揃い da4=(0da4) nodebytes[0] = createByteToChars('0',nocts[0]); nodebytes[1] = createByteToChars(nocts[1],nocts[2]); break; case 4://4つ揃い 1d5d nodebytes[0] = createByteToChars(nocts[0],nocts[1]); nodebytes[1] = createByteToChars(nocts[2],nocts[3]); break; default://空だったと nodebytes[0] = (byte)0; nodebytes[1] = (byte)0; } return nodebytes; } /** * 上位4ビットとなるキャラと下位4ビットとなるキャラを組み合わせて1つのバイトを作成するためのメソッド。 * キャラは16の基数を作成できるもの。つまり0-9,a-eのみ。 * * @param top 上位4ビットとなるキャラ * @param bottom 下位4ビットとなるキャラ * @return 各キャラを組み合わせたbyteデータ */ public static byte createByteToChars(char top, char bottom) { byte topb = Byte.parseByte(new Character(top).toString(),HEX); byte btmb = Byte.parseByte(new Character(bottom).toString(),HEX); return (byte)*1 { octstrs[i]=decodeIpv6OneOctet(foctet[count++],foctet[count++]); }else { byte ipv4b = {foctet[count++], foctet[count++], foctet[count++], foctet[count++]}; int ipv4i = revisionIp4addressOfInt(ipv4b); octstrs[i] = createIpv4StrBasic(ipv4i); } } return octstrs; } /** * 引数で与えられた1オクテットの先頭部分から連続する0を取り除くためのメソッド * @param octet 1オクテット分の文字列 * @return 先頭から連続する0を取り除いた文字列 */ public static String pullZero(String octet) { if(octet == null) { return octet; } char occhr=octet.toCharArray(); if(occhr.length == 1 | occhr.length == 0) { return octet; } StringBuffer buf = new StringBuffer(); boolean flag = true; for(int i=0;i foctet) { if(foctet.length != IPV6OCTETS_BYTE) { return null; } String ocstrs = decodeIpv6FullOctet(foctet); StringBuffer buf = new StringBuffer(); boolean flag=false; for(int i=0;i foctet) { if(foctet.length != IPV6OCTETS_BYTE) { return null; } String[] ocstrs = decodeIpv6FullOctet(foctet); StringBuffer buf = new StringBuffer(); boolean flag=false; for(int i=0;i
*1:topb<<4)|btmb);
}
/**
* IPv6の1オクテットを2バイトから作成するためのメソッド.
* @param topoct 上位バイト
* @param btmoct 下位バイト
* @return 1オクテットの文字列
*/
public static String decodeIpv6OneOctet(byte topoct, byte btmoct) {
StringBuffer octstr = new StringBuffer();
octstr.append(Integer.toHexString(((topoct>>>4)&0xF)));
octstr.append(Integer.toHexString((topoct&0xF)));
octstr.append(Integer.toHexString(((btmoct>>>4)&0xF)));
octstr.append(Integer.toHexString((btmoct&0xF)));
return octstr.toString();
}
/**
* IPv6の全てのオクテット文字列をバイトから作成するためのメソッド。
*
* @param foctet 128bit分のバイト配列
* @return IPv6形式の文字列配列
*/
public static String decodeIpv6FullOctet(byte foctet) {
if(foctet.length != 16) {
return null;
}
String octstrs = new String[IPV6OCTETS_BYTE/2];
int count=0;
for(int i=0;i