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"));
}
}