package  fr.zng.xxzx.common.util;

import java.math.BigInteger;

		
public class CRC {

	public static void main(String[] args) {
		String acMsg="010300000001840a";
		System.out.println(checkCRC(acMsg));
//		String str = "000102030405060708091011";
		String str = "000102030405060708091011";
		System.out.println(getCRC(str));
	}

	
	/**
     * 计算CRC16校验码 先低位再高位 补零
     *
     * @param bytes 字节数组
     * @return {@link String} 校验码
     * @since 1.0
     */
    public static String getCRC(String str) {
    	byte[] bytes = hexstringTobytes(str);
        int CRC = 0x0000ffff;
        int POLYNOMIAL = 0x0000a001;
        int i, j;
        for (i = 0; i < bytes.length; i++) {
            CRC ^= ((int) bytes[i] & 0x000000ff);
            for (j = 0; j < 8; j++) {
                if ((CRC & 0x00000001) != 0) {
                    CRC >>= 1;
                    CRC ^= POLYNOMIAL;
                } else {
                    CRC >>= 1;
                }
            }
        }
        StringBuffer sb=new StringBuffer();
        if(Integer.toHexString(CRC%(16*16)).length()==1){
        	sb.append("0");
        }
        sb.append(Integer.toHexString(CRC%(16*16)));
        if(Integer.toHexString(CRC/16/16).length()==1){
        	sb.append("0");
        }
        sb.append(Integer.toHexString(CRC/16/16));
        
        return new String(sb);
    }

    /**
     * 将16进制单精度浮点型转换为10进制浮点型
     *
     * @return float
     * @since 1.0
     */
    private float parseHex2Float(String hexStr) {
        BigInteger bigInteger = new BigInteger(hexStr, 16);
        return Float.intBitsToFloat(bigInteger.intValue());
    }

    /**
     * 将十进制浮点型转换为十六进制浮点型
     *
     * @return String
     * @since 1.0
     */
    private String parseFloat2Hex(float data) {
        return Integer.toHexString(Float.floatToIntBits(data));
    }
    /**
     *   字节数组  转换为  十六进制字符串
     * @return 
     */
    public static String bytesToHexstring(byte[] bs){
    	StringBuffer result=new StringBuffer();
    	for(int i=0;i<bs.length;i++){
    		if(Integer.toHexString(bs[i]).length()==1){
    			result.append("0");
    		}
    		result.append(Integer.toHexString(bs[i]));
    	}
    	return new String(result);
    }
    /**
     * 16进制字符串 转为 字节数组 
     * @param a
     * @return byte[]
     */
    
    public static byte[] hexstringTobytes(String a){
    	byte[] bytes=new byte[a.length()/2];
    	if(a.length()>2){
    		for(int i=0;i<bytes.length;i++){
        		bytes[i]=(byte) Integer.parseInt(a.substring(i*2,i*2+2),16);
        	}
    	}
		return bytes;
    }
    /**
     * crc校验
     * @param acMsg
     * @return boolean
     */
    public static boolean checkCRC(String acMsg){
    	if(acMsg.length()<4){
    		return false;
    	}
		String check = acMsg.substring((acMsg.length() - 4), acMsg.length());
		String data = acMsg.substring(0, (acMsg.length() - 4));
		return check.equals(getCRC(data));
    }
}
