原文地址
/**
* 报文校验码验证规则
*/
public class Verification {
/**
* 校验校验码是否一致
* @param type 需要使用的校验规则
* @param bytes 待生成校验码的字节数组
* @param code 待匹配的校验码字节数组
* @param changeGD 是否高低位转换,true低位在前高位在后,false高位在前低位在后
* @return true校验一致
*/
public static boolean checkVerification(int type,byte[] bytes,byte[] code,boolean changeGD){
switch (type){
case 10:
byte b = andVerification(bytes);
if(b==code[0])
return true;
else
return false;
case 11:
byte[] b1 = crcVerification(bytes,changeGD);
if(b1[0]==code[0]&&b1[1]==code[1])
return true;
else
return false;
case 12:
byte b2 = orVerification(bytes);
if(b2==code[0])
return true;
else
return false;
case 13:
byte b3 = complement(bytes);
if(b3==code[0])
return true;
else
return false;
default:
return false;
}
}
/**
* 异或校验,返回一个字节
* @param bytes 待计算校验的字节数组
* @return 校验码
*/
public static byte orVerification(byte[] bytes){
int nAll = 0;
for (int i = 0; i < bytes.length; i++) {
int nTemp = bytes[i];
nAll = nAll ^ nTemp;
}
return (byte) nAll;
}
/**
* 和校验,所有数据求和后%256 ,返回一个字节
* @param bytes 待计算校验的字节数组
* @return 校验码
*/
public static byte andVerification(byte[] bytes){
int iSum = 0;
for (int i = 0;i < bytes.length;i++)
{
iSum += bytes[i];
}
iSum %= 0x100;
return (byte)iSum;
}
/**
* CRC校验,返回两个字节
* @param bytes 待计算校验的字节数组
* @param changeGD 是否转换高低位,true低位在前高位在后,false高位在前低位在后
* @return 校验码
*/
public static byte[] crcVerification(byte[] bytes,boolean changeGD){
int CRC = 0x0000ffff;
int POLYNOMIAL = 0x0000a001;
int i, j;
for (i = 0; i < bytes.length; i++) {
CRC ^= (int) bytes[i];
for (j = 0; j < 8; j++) {
if ((CRC & 0x00000001) == 1) {
CRC >>= 1;
CRC ^= POLYNOMIAL;
} else {
CRC >>= 1;
}
}
}
if(changeGD){
CRC = ( (CRC & 0x0000FF00) >> 8) | ( (CRC & 0x000000FF ) << 8);
}
return String.valueOf(CRC).getBytes();
}
/**
* 补码求和校验,返回一个字节
* @param bytes 待计算校验的字节数组
* @return 校验码
*/
public static byte complement(byte[] bytes){
int iSum = 0;
for (int i = 0;i < bytes.length;i++)
{
iSum += bytes[i];
}
iSum = 256 - iSum;
return (byte) iSum;
}
}