Ipv6のユーティルもどき

※ゴミが付いたので削除&再投稿

とりあえず、正常系?っぽい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;i nnodes = 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 decodeIpv6FullOctetContainsIpv4(byte foctet) { if(foctet.length != 16) { return null; } String octstrs = new String[(IPV6OCTETS_BYTE/2)-1]; int count=0; for(int i=0;i