package test;


public class CRC
{
	/**
	 * getCRC<计算str的校验值>
	 * 
	 * @param str为十六进制
	 * @return s为十六进制
	 */
	public static String getCRC(String str)
	{
		int crc = 0x00; // initial value
		int polynomial = 0x1021;
		byte[] bytes = Str.HexStr2ByteArray(str);

	
		for (int index = 0; index < bytes.length; index++)
		{
			byte b = bytes[index];
			for (int i = 0; i < 8; i++)
			{
				boolean bit = ((b >> (7 - i) & 1) == 1);
				boolean c15 = ((crc >> 15 & 1) == 1);
				crc <<= 1;
				if (c15 ^ bit)
					crc ^= polynomial;
			}
		}
		crc &= 0xffff;
		str = Integer.toHexString(crc).toUpperCase();
		return str;
	}
	
	/**
	 * checkCRC<检查校验值是否正确>
	 * 
	 * @param str为十六进制,其中包含描述部分,数据部分,校验部分
	 * @return 正确返回true,错误返回false
	 */
	public static boolean checkCRC(String str)
	{
		int len=str.length();
		String data=str.substring(0, len-4);
		String crc=str.substring(len-4, len);

		if(getCRC(data).equals(crc))
			return true;
		else
			return false;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(getCRC("1CBA"));
	}

}