【问题标题】:Java perform crc check (divide bytearray by bytearray)Java 执行 crc 检查(将字节数组除以字节数组)
【发布时间】:2013-10-02 09:34:08
【问题描述】:

我在一个字节数组上生成了一个CRC 整数,并将它也转换为 4 字节数组。我使用了this CRC16 类,它使用生成多项式=0x1021;,这意味着1 + x + x^5 + x^12 + x^16 我将我的字节数组和CRC 通过UDP 发送到服务器。在服务器端,我喜欢检查字节数组是否正确传输。据我了解,我可以将与 crc-array 连接的数据数组除以生成多项式。我理解对了吗?以及如何在Java中通过生成多项式执行data+crc除法?

我见过的解决方案只是在数据上再次生成 crc 代码并比较生成的 crc 代码是否相同,但这可能是 crc-codes 的用途。

【问题讨论】:

  • 重新计算CRC并进行比较是最简单的事情。
  • 顺便说一句,您的检查是不必要的,因为 UDP 确实保证 byte[] 将与发送的相同,因为 UDP 在发送数据报之前使用校验和执行它自己的检查。
  • 这更多是出于教育原因,而不是真正的用例,但如果您参考此声明会很好;)
  • 当然:en.wikipedia.org/wiki/User_Datagram_Protocol 如果您想要更“官方”的内容,可以点击其中的链接

标签: java udp bytearray crc crc16


【解决方案1】:

CRC 旨在让您简单地重复 CRC 计算,但将 CRC 字节附加到数据字节。来自Wikipedia

通过执行上述操作,可以很容易地验证接收到的消息的有效性 再次计算,这次添加了校验值而不是零。剩下的 如果没有可检测到的错误,则应为零。

【讨论】:

  • 只有在 CRC 没有预处理或后处理时才有效,大多数情况下都有。常见的方法是使用任何检查算法来做你想做的事情,即仅根据收到的消息计算它,并将其与收到的检查值进行比较。
  • 因为我的代码在计算校验和后进行了修改 [crc &= 0xffff;] 我需要按照您说的方式进行操作,但接受上面的答案。
  • @MarkAdler 如果 CRC 有预处理或后处理,它怎么能成为有用的检查?我对这些类型检查(CRC、奇偶校验)的理解是,您只需为整个接收到的消息(包括检查位)计算它,并确保结果为 0。
  • 这是一个有用的检查,因为你可以检查它!如果包括 CRC 在内的任何类型的确定性算法在消息上产生校验值,那么相同的校验值应该由另一端的相同消息上的相同算法产生。如果没有,则消息或检查值已损坏。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 2011-10-04
  • 2011-11-06
  • 1970-01-01
相关资源
最近更新 更多