纵向冗余校验(Longitudinal Redundancy Check,简称:LRC)是通信中常用的一种校验形式,也称LRC校验或纵向校验;它是一种从纵向通道上的特定比特串产生校验比特的错误检测方法;通常Modbus协议ASCII模式采用LRC算法。
1.生成LRC校验
/**
* 生成LRC校验值:
*
* 1)对需要校验的数据(2n个字符)两两组成一个16进制的数值求和;
* 2)将求和结果与256求模;
* 3)用256减去所得模值得到校验结果(另一种方法:将模值按位取反然后加1);
*/
public static int getCalculateLRC(String data) {
if (data.length() % 2 != 0) {
throw new IllegalArgumentException("输入数据长度必须为偶数");
}
int sum = 0;
//两两组合字符转换为十六进制数值求和
for (int i = 0; i < data.length(); i += 2) {
String hex = data.substring(i, i + 2);
try {
int value = Integer.parseInt(hex, 16);
sum += value;
} catch (NumberFormatException e) {
throw new IllegalArgumentException("输入数据包含非十六进制字符", e);
}
}
//求和结果与256求模
int mod = sum % 256;
//计算校验结果
return 256 - mod;
}
2.调用
ASCII字符串:900600000005
调用方法:getCalculateLRC("900600000005");
LRC校验:65
组合ASCII字符串:90060000000565