package com.its.app.utils;

public class ByteUtils {

	private static final int[] BYTE_MASKED_ARRAY = { 1, 2, 4, 8, 16, 32, 64, 128 };

	public static int byteToInt(byte srcValue)
	{
		return srcValue & 0xFF;
	}

	public static int shortToInt(short srcValue)
	{
		return srcValue & 0xFFFF;
	}

	public static long intToLong(int srcValue)
	{
		return srcValue & 0xFFFFFFFF;
	}

	public static int longToInt(long srcValue)
	{
		return (int)(srcValue & 0xFFFFFFFF);
	}

	public static String byteToBitString(byte srcValue)
	{
		return String.format("%8s", Long.toBinaryString(srcValue & 0xFF)).replace(' ', '0');
	}

	public static String shortToBitString(short srcValue)
	{
		return String.format("%16s", Long.toBinaryString(srcValue & 0xFF)).replace(' ', '0');
	}

	public static String intToBitString(int srcValue)
	{
		return String.format("%32s", Integer.toBinaryString(srcValue & 0xFF)).replace(' ', '0');
	}

	public static String longToBitString(long srcValue)
	{
		return String.format("%64s", Long.toBinaryString(srcValue & 0xFF)).replace(' ', '0');
	}

	public static int extractBits(byte srcValue, int beginBitDigit, int endBitDigit)
	{
		int maskedValue = 0;
		for (int idx = beginBitDigit; idx <= endBitDigit; idx++) {
			maskedValue += BYTE_MASKED_ARRAY[idx];
		}
		return (srcValue & maskedValue) >> beginBitDigit;
	}

	public static int extractBit(byte srcValue, int bitDigit)
	{
		return (srcValue & BYTE_MASKED_ARRAY[bitDigit]) == BYTE_MASKED_ARRAY[bitDigit] ? 1 : 0;
	}

	public static int compareMaskedValue(byte srcValue, int maskValue, int compareValue)
	{
		int resultValue = byteToInt(srcValue) & maskValue;
		return resultValue == compareValue ? 0 : resultValue > compareValue ? 1 : -1;
	}

	public static String convertCustomDateTime(String strDate)
	{
		String convertDate = strDate;
		if (convertDate.lastIndexOf(".") != -1) {
			convertDate = convertDate.substring(0, convertDate.lastIndexOf("."));
		}
		return convertDate.replaceAll("-", "").replaceAll(":", "").replaceAll(" ", "");
	}

	public static byte[] hexToByteArray(String hex)
	{
		if ((hex == null) || (hex.length() == 0)) {
			return null;
		}
		byte[] ba = new byte[hex.length() / 2];
		for (int i = 0; i < ba.length; i++) {
			ba[i] = ((byte)Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16));
		}
		return ba;
	}

	public static String byteArrayToHex(byte[] ba)
	{
		return byteArrayToHex(ba, null);
	}

	public static byte[] intToShortBytes(int length)
	{
		byte[] b3 = new byte[2];
		if (length > 255)
		{
			b3[0] = ((byte)(length / 256));
			b3[1] = ((byte)(length % 256));
		}
		else
		{
			b3[0] = 0;
			b3[1] = ((byte)length);
		}
		return b3;
	}

	public static int getIntOnBit(int n, int offset, int length)
	{
		return n >> 32 - offset - length & (-1 << length ^ 0xFFFFFFFF);
	}

	public static String byteArrayToHex(byte[] ba, String seperator)
	{
		if ((ba == null) || (ba.length == 0)) {
			return null;
		}

		StringBuffer sb = new StringBuffer(ba.length * 2);
		for (int x = 0; x < ba.length; x++)
		{
			String hexNumber = "0" + Integer.toHexString(0xFF & ba[x]).toUpperCase();

			sb.append(hexNumber.substring(hexNumber.length() - 2));
			//if (seperator != null && !seperator.isEmpty()) {
				sb.append(seperator);
			//}
		}
		return sb.toString();
	}

	static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
	public static final int BIT_1 = 1;
	public static final int BIT_2 = 3;
	public static final int BIT_3 = 7;
	public static final int BIT_4 = 15;
	public static final int BIT_5 = 31;
	public static final int BIT_6 = 63;
	public static final int BIT_7 = 127;
	public static final int BIT_8 = 255;
	public static final int BIT_9 = 511;
	public static final int BIT_10 = 1023;
	public static final int BIT_11 = 2047;
	public static final int BIT_12 = 4095;
	public static final int BIT_13 = 8191;
	public static final int BIT_14 = 16383;
	public static final int BIT_15 = 32767;
	public static final int BIT_16 = 65535;

	public static String bytesToHex(byte[] bytes, int bundleSize, char seperator)
	{
		char[] hexChars = new char[bytes.length * 2 + bytes.length / bundleSize];
		int j = 0;
		for (int k = 1; j < bytes.length; k++)
		{
			int v = bytes[j] & 0xFF;
			int start = j * 2 + j / bundleSize;

			hexChars[start] = HEX_ARRAY[(v >>> 4)];
			hexChars[(start + 1)] = HEX_ARRAY[(v & 0xF)];
			if (k % bundleSize == 0) {
				hexChars[(start + 2)] = seperator;
			}
			j++;
		}
		return new String(hexChars).trim();
	}

	public static String bytesToHex(byte[] bytes, int bundleSize)
	{
	return bytesToHex(bytes, bundleSize, ' ');
	}

	public static String byteToHex(byte b)
	{
	String hexNumber = "0" + Integer.toHexString(0xFF & b).toUpperCase();
	return hexNumber.substring(hexNumber.length() - 2);
	}

	public static int convertNotNullStringToInt(String data)
	{
		if (data == null || data.trim().length() == 0)
			return 0;
		return Long.valueOf(data).intValue();
	}

	public static double convertNotNullStringToDouble(String data)
	{
		if (data == null || data.trim().length() == 0)
			return 0.0D;
		return Double.valueOf(data).doubleValue();
	}

	public static String extractFilePath(String fullPath)
	{
		String resultPath = fullPath;
		int lastPathIndex = resultPath.lastIndexOf("/") != -1 ? resultPath.lastIndexOf("/") : resultPath.lastIndexOf("\\");
		return lastPathIndex != -1 ? resultPath.substring(0, lastPathIndex + 1) : resultPath;
	}

	public static String extractFileName(String fullPath)
	{
		String resultPath = fullPath;
		int lastPathIndex = resultPath.lastIndexOf("/") != -1 ? resultPath.lastIndexOf("/") : resultPath.lastIndexOf("\\");
		return lastPathIndex != -1 ? resultPath.substring(lastPathIndex + 1) : resultPath;
	}

	public static String lpad(String str, int len, String pad)
	{
		String result = str;
		int templen = len - result.length();
		for (int i = 0; i < templen; i++) {
			result = pad + result;
		}
		return result;
	}

	public static int getBitField(byte b, int field)
	{
		return (b & 1 << field) > 0 ? 1 : 0;
	}

	public static int getBitField(byte b, int field, int count)
	{
		if (count == 1) {
			count = 1;
		} else if (count == 2) {
			count = 3;
		} else if (count == 3) {
			count = 7;
		} else if (count == 4) {
			count = 15;
		} else if (count == 5) {
			count = 31;
		} else if (count == 6) {
			count = 63;
		} else if (count == 7) {
			count = 127;
		} else if (count == 8) {
			count = 255;
		} else if (count == 9) {
			count = 511;
		} else if (count == 10) {
			count = 1023;
		} else if (count == 11) {
			count = 2047;
		} else if (count == 12) {
			count = 4095;
		} else if (count == 13) {
			count = 8191;
		} else if (count == 14) {
			count = 16383;
		} else if (count == 15) {
			count = 32767;
		} else if (count == 16) {
			count = 65535;
		}
		return b >> field & count;
	}

	public static byte setBitField(byte b, int field, int value)
	{
		if ((value == 0) || (value == 1)) {
			b = (byte)(b | value << field);
		}
		return b;
	}

	public static byte setBitField(byte b, int field, int count, int value)
	{
		if ((field + count <= 8) && (value < Math.pow(2.0D, count))) {
			if (count == 1) {
				count = 1;
			} else if (count == 2) {
				count = 3;
			} else if (count == 3) {
				count = 7;
			} else if (count == 4) {
				count = 15;
			} else if (count == 5) {
				count = 31;
			} else if (count == 6) {
				count = 63;
			} else if (count == 7) {
				count = 127;
			} else if (count == 8) {
				count = 255;
			} else if (count == 9) {
				count = 511;
			} else if (count == 10) {
				count = 1023;
			} else if (count == 11) {
				count = 2047;
			} else if (count == 12) {
				count = 4095;
			} else if (count == 13) {
				count = 8191;
			} else if (count == 14) {
				count = 16383;
			} else if (count == 15) {
				count = 32767;
			} else if (count == 16) {
				count = 65535;
			}
		}
		b = (byte)(b & (count << field ^ 0xFFFFFFFF));
		b = (byte)(b | (value & count) << field);

		return b;
	}
}
