Java 中的 CRC 程序

2025年5月12日 | 阅读 5 分钟

CRC 是 **循环冗余校验 (Cyclic Redundancy Check)** 的缩写。它由 W. Wesley Peterson 于 1961 年发明。它是一种错误检测技术,可用于检测数字网络(或通信通道或数字数据)和存储设备中的错误。它用于追踪数字数据中的意外更改。在本节中,我们将学习如何通过 Java 程序计算和执行 CRC。让我们详细了解 CRC。

CRC 机制

它是一种错误检测机制,其中将一个特殊数字添加到数据块中。添加数字的主要目的是识别传输或存储过程中发生的更改。它会被计算两次,一次在数据传输期间的发送方,一次在接收方重新计算。它将数据逐位与最初传输的值进行比较。如果在数据传输过程中发生任何错误(损坏的位),CRC 将与最初传输的值不匹配。我们可以通过下图轻松理解 CRC 机制。

CRC Program in Java
CRC Program in Java

例如,数据中的单个损坏位会导致计算出的 CRC 发生一位变化,但多个损坏位可能会相互抵消。如果损坏或改变的多个位被称为突发错误。

还有一些其他的错误检测机制,如垂直冗余校验(VRC)和纵向冗余校验(LRC),但 CRC 比其他机制更强大。CRC 的算法更复杂,因为它使用二进制除法来计算 CRC。除数是使用多项式生成的。因此,CRC 也被称为多项式码校验和。

以下是在 CRC 中用于错误检测的步骤

  • 第一步,我们在数据单元后面附加N个零。N 的值始终小于数据单元中的位数(称为除法,为N+1)。
  • 下一步,我们使用二进制除法过程将新扩展的数据除以除数,从该除法中获得的余数称为 CRC 余数。
  • 下一步,我们将之前在数据单元中附加的所有零替换为余数位。之后,我们将新生成的数据单元发送给接收方。
  • 接收方接收带有 CRC 余数的数据单元。之后,接收方用除数除以数据单元。
  • 如果用除数除以数据单元后余数为零,则数据单元未损坏,可以接受。
  • 如果用除数除以数据单元后余数不等于零,则数据单元已损坏,将被丢弃。

让我们举个例子来理解 CRC 是如何工作的

假设原始数据是 11100,除数是 1001。

  • 首先,我们将在数据单元部分添加零。除数的长度是 4,我们知道字符串 0 的长度总是比其除数少一位。所以,我们在数据单元中附加三个零,即11100
  • 附加零后,结果字符串将是 11100000,我们用除数1001对其进行除法。我们使用二进制除法过程来除以除数。
  • 用除数除以数据单元后得到的余数称为 CRC 余数。
  • CRC 余数替换数据单元末尾附加的零字符串,最终字符串为 11100111,将通过网络发送。

CyclicRedundancyCheck.java

输出

CRC Program in Java
CRC Program in Java
CRC Program in Java