如何在 Java 中计算 LRC
How to Calculate LRC in Java
我的消息协议如下:
- STX: 0x02
- ETX: 0x03
DLE: 0x10(在 0x2、0x3 或 0x10 前面使用的分隔符,它们是数据字节,而不是 STX、ETX 或 DLE)。
DATA:0x02、0x03 或 0x10 的任何值都被分隔以避免与 STX、ETX 和 DLE
混淆
LRC:计算为 'XOR',不包括任何 DLE 和 STX,但包括 ETX。此外,即使 LRC 值是 0x2、0x3 或 0x10,它们也不会被分隔。
这是我正在测试的数据测试消息:
byte[] testMessage1 = {
0x02, // STX
0x10,0x2,0xA,0x10,0x10,0x7,0x8, // Data 02, A, 10, 7, 8
0x03, // ETX
0x2^0xA^0x10^0x7^0x8^0x03 // LRC calculated from the data (with the DLE removed) plus the ETX
};
这是我的 LRC 计算:
public static byte calculateLRC(byte[] bytes) {
byte LRC = 0;
for (int i = 1; i < bytes.length; i++) {
LRC ^= bytes[i];
}
return LRC;
}
如何根据协议对测试字节报文进行LRC计算,检查是否为有效报文,以及之前的数据是否损坏?
从广义上讲,解析与 state 变量一起工作,并且根据读取的下一个符号,状态会发生变化(错误是一种可能的状态)。
在你的协议中,为了验证消息,如果你从一开始就从逻辑上考虑它,你可以计算出状态。
第一个字节显然必须是STX,否则就不是有效消息。之后,您想在计算 LRC 的同时寻找 ETX。一旦找到 ETX,下一个字节必须是 LRC。条件状态,如通过 DLE 转义,也可以表示为不同的状态:
State 0:
If Symbol STX -> State 1
else -> Error
State 1:
If Symbol = ETX -> State 3
else if Symbol = DLE -> State 2
else update LRC
State 2:
update LRC -> State 1
State 3:
if Symbol == LRC -> Ok
else Error
一旦你有了这个状态转换table,把它放到代码中应该不会太困难。
我的消息协议如下:
- STX: 0x02
- ETX: 0x03
DLE: 0x10(在 0x2、0x3 或 0x10 前面使用的分隔符,它们是数据字节,而不是 STX、ETX 或 DLE)。
DATA:0x02、0x03 或 0x10 的任何值都被分隔以避免与 STX、ETX 和 DLE
混淆
LRC:计算为 'XOR',不包括任何 DLE 和 STX,但包括 ETX。此外,即使 LRC 值是 0x2、0x3 或 0x10,它们也不会被分隔。
这是我正在测试的数据测试消息:
byte[] testMessage1 = {
0x02, // STX
0x10,0x2,0xA,0x10,0x10,0x7,0x8, // Data 02, A, 10, 7, 8
0x03, // ETX
0x2^0xA^0x10^0x7^0x8^0x03 // LRC calculated from the data (with the DLE removed) plus the ETX
};
这是我的 LRC 计算:
public static byte calculateLRC(byte[] bytes) {
byte LRC = 0;
for (int i = 1; i < bytes.length; i++) {
LRC ^= bytes[i];
}
return LRC;
}
如何根据协议对测试字节报文进行LRC计算,检查是否为有效报文,以及之前的数据是否损坏?
从广义上讲,解析与 state 变量一起工作,并且根据读取的下一个符号,状态会发生变化(错误是一种可能的状态)。
在你的协议中,为了验证消息,如果你从一开始就从逻辑上考虑它,你可以计算出状态。
第一个字节显然必须是STX,否则就不是有效消息。之后,您想在计算 LRC 的同时寻找 ETX。一旦找到 ETX,下一个字节必须是 LRC。条件状态,如通过 DLE 转义,也可以表示为不同的状态:
State 0:
If Symbol STX -> State 1
else -> Error
State 1:
If Symbol = ETX -> State 3
else if Symbol = DLE -> State 2
else update LRC
State 2:
update LRC -> State 1
State 3:
if Symbol == LRC -> Ok
else Error
一旦你有了这个状态转换table,把它放到代码中应该不会太困难。