package fr.zng.xxzx.common.util;

/**
 * destools用到的工具类
 */
public class DesToolUtil {
	/**
	 * byte数组转换�??6进制字符�??
	 * 
	 * @param b
	 * @return
	 */
	public static String bytes2HexString(byte[] b) {
		String ret = "";
		// System.out.println(b);
		for (int i = 0; i < b.length; i++) {
			String hex = Integer.toHexString(b[i] & 0xFF);
			if (hex.length() == 1) {
				hex = '0' + hex;
			}
			ret += hex.toUpperCase();
		}
		return ret;
	}

	/**
	 * 16进制字符串转成byte数组,转换后为8字节长度
	 * 
	 * @param src
	 * @return
	 */
	public static byte[] hexString2Bytes(String src) {
		byte[] ret = new byte[8];
		byte[] tmp = src.getBytes();
		for (int i = 0; i < 8; i++) {
			ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
		}
		return ret;
	}

	/**
	 * 16进制字符串转成byte数组
	 * 
	 * @param src
	 * @return
	 */
	public static byte[] hexString2Byteslong(String src) {
		String src1 = src.replaceAll("\\s*", "");
		;
		if (src1.length() % 2 == 1) {
			src1 = src1 + "0";
		}
		byte[] tmp = src1.getBytes();

		byte[] ret = new byte[src1.length() / 2];
		for (int i = 0; i < src1.length() / 2; i++) {
			ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);

		}
		return ret;
	}

	/**
	 * 两个16进制字（字母或数字）合并为一�??字节
	 * 
	 * @param src0
	 * @param src1
	 * @return
	 */
	public static byte uniteBytes(byte src0, byte src1) {
		byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 }))
				.byteValue();
		_b0 = (byte) (_b0 << 4);
		byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 }))
				.byteValue();
		byte ret = (byte) (_b0 ^ _b1);
		return ret;
	}

	/**
	 * 两个16进制字（字母或数字）合并为一�??0进制数组
	 * 
	 * @param hex
	 * @return 10进制数组
	 */
	public static int[] hexToInt(String hex) {
		int[] ret = new int[hex.length() / 2];
		int j = 0;
		for (int i = 0; i < hex.length(); i = i + 2) {
			ret[j] = Integer.parseInt(hex.substring(0 + i, i + 2), 16);
			j++;
		}

		return ret;
	}

	/**
	 * 两个16进制字（字母或数字）合并为一个取�??0进制数组
	 * 
	 * @param hex
	 * @return 10进制数组
	 */
	public static int[] hexTonotInt(String hex) {
		int[] ret = new int[hex.length() / 2];
		int j = 0;
		for (int i = 0; i < hex.length(); i = i + 2) {
			ret[j] = 255 - Integer.parseInt(hex.substring(0 + i, i + 2), 16);
			j++;
		}

		return ret;
	}

	/**
	 * 两个16进制字（字母或数字）转换为取反后的hex
	 * 
	 * @param hex
	 * @return 10进制数组
	 */
	public static String hexTonotHex(String hex) {
		String temp = "";
		for (int i = 0; i < hex.length(); i = i + 2) {
			temp = temp
					+ padLeft(
							Integer.toHexString(255 - Integer.parseInt(
									hex.substring(0 + i, i + 2), 16)), 2, '0');
		}

		return temp;
	}

	/**
	 * 対象文字列の桁数は指定長さより未�??��場合、先頭に指定文字を埋め込�??
	 * 
	 * @param resultStr
	 *            対象文字�??
	 * @param len
	 *            長さ
	 * @param str
	 *            文字
	 * @return 結果文字�??
	 */
	public static String padLeft(String resultStr, int len, char str) {

		String strObj = resultStr;
		if (null == strObj) {
			strObj = "";
		}

		StringBuffer buf = new StringBuffer(strObj);

		while (buf.length() < len) {
			buf.insert(0, str);
		}
		return buf.toString();
	}

}
