首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中计算LRC

如何在Java中计算LRC
EN

Stack Overflow用户
提问于 2015-04-10 10:37:05
回答 1查看 1.7K关注 0票数 0

我的消息协议如下:

  • STX: 0x02
  • ETX: 0x03
  • DLE: 0x10 (在0x2、0x3或0x10之前使用的分隔符,它们是数据字节,而不是STX、ETX或DLE)。
  • 数据:任何0x02、0x03或0x10的值都被分隔,以避免与STX、ETX和DLE混淆。
  • LRC:计算为“XOR”,不包括任何DLEs和STX,但包括ETX。此外,即使LRC值是0x2、0x3或0x10,也不会对它们进行分隔。

下面是我正在测试的数据测试消息:

代码语言:javascript
复制
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
};  

以下是法改会的计算数字:

代码语言:javascript
复制
public static byte calculateLRC(byte[] bytes) {
    byte LRC = 0;
    for (int i = 1; i < bytes.length; i++) {
        LRC ^= bytes[i];
    }
    return LRC;
} 

如何根据协议对测试字节消息进行LRC计算,以检查其是否为有效消息,以及未损坏之前的数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-10 13:01:02

从广义上讲,解析可以使用状态变量,并根据下一个符号读取状态进行更改(错误是一个可能的状态)。

在您的协议中,为了验证一条消息,如果您从一开始就从逻辑上考虑它,您可以计算出状态。

第一个字节显然必须是STX,否则它将不是有效的消息。在此之后,您需要计算LRC,同时也要查找ETX。一旦找到ETX,下一个字节必须是LRC。条件状态,比如通过DLE转义,也可以表示为不同的状态:

代码语言:javascript
复制
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

一旦您有了这个状态转换表,将它放入代码中就不会太困难了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29559288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档