如何在 Linux 中使用 Cksum 命令计算 CRC 校验和

举报
Tiamo_T 发表于 2022/07/04 15:59:44 2022/07/04
【摘要】 在本文中,我们将重点介绍 Linux 'cksum' 命令,该命令用于计算文件的校验和或标准输入提供的数据。

校验和用于验证数据的完整性。假设某些文件正在通过网络或系统复制,并且由于网络连接丢失或机器突然重启等事件,数据没有被完全复制。

现在,您将如何验证数据的完整性?那么,它通过CRC校验和机制可以验证数据完整性。可以通过多种机制计算 CRC 校验和。在本文中,我们将重点介绍 Linux 'cksum' 命令,该命令用于计算文件的校验和或标准输入提供的数据。

什么是 CRC?

CRC 代表循环冗余校验。

校验和可以通过对正在传送的数据应用循环冗余校验 (CRC) 机制来计算。通过通信信道传输的每个数据块都附有 CRC 码或校验和,当数据块到达目的地时,再次应用该校验以生成校验和值。如果在目的地生成的校验和与数据块中的校验和值相同,则认为数据未损坏并且可以进一步使用,但如果两个校验和值不同,则在这种情况下,数据被认为已损坏或被感染。

CRC这个名字是因为:

  • 这种机制基于循环码(因此是循环的)的基本原理。
  • 附加数据作为校验和的代码是冗余的,即它不会为正在传输的数据增加任何价值(因此冗余)。
  • 它是一张支票(因此check

校验和命令

cksum 命令用于计算作为参数提供给它的每个文件的循环冗余校验 (CRC)。在需要验证数据完整性的情况下,CRC 变得很重要。使用 cksum 命令,可以比较目标文件和源文件的校验和来判断数据传输是否成功。

除了提供 CRC 值外,此命令还在输出中生成文件大小和文件名。如果成功,该命令以状态零退出,任何其他状态值表示失败。

可以通过在命令提示符下键入以下内容来获取有关此命令的详细信息:

$ info coreutils 'cksum invocation'

cksum 命令示例

1. 一个基本的例子

在非常基本的层面上, cksum 命令可用于显示文件的校验和。

$ cksum testfile.txt
3000792507 3 testfile.txt

上面输出中的第一个值(大数字)是文件的校验和,然后是文件的大小,最后是文件的名称。

2.校验和随着内容的变化而变化

测试文件“testfile.txt”有以下内容:

$ cat testfile.txt
Hi

要计算测试文件的校验和,请将其作为参数传递给 cksum 命令:

$ cksum testfile.txt
2559130041 14 testfile.txt

现在,修改文件的内容:

$ cat testfile.txt
Hi everybody

再次将测试文件作为参数传递给 cksum 命令:

$ cksum testfile.txt
2559130041 14 testfile.txt

所以我们看到随着内容的变化,校验和也发生了变化。

3.内容的变化并不总是意味着大小的增加或减少

好吧,上述内容从根本上也是正确的,甚至对于 chksum 也是如此。让我们看看它是什么意思:

检查测试文件 'testfile.txt' 的内容:

$ cat testfile.txt
Hi everybody

注意校验和:

$ cksum testfile.txt
2559130041 14 testfile.txt

现在,通过不实际添加或删除某些内容,而是将一个字符替换为另一个字符来更改内容,以使文件的大小保持不变。

$ cat testfile.txt
Hi everybudy.

如您所见,我将“o”替换为“u”。

现在比较校验和:

$ cksum testfile.txt
3252191934 14 testfile.txt

因此,我们看到校验和发生了变化,即使更改是一个字符被另一个字符替换。

4. 被打断的副本

假设您正在将包含各种子文件夹和文件的压缩文件夹从一个位置复制到另一个位置,并且由于任何原因,复制过程被中断,那么您将如何检查所有内容是否已成功复制?好吧, cksum 使之成为可能,因为现在我们知道在部分复制的情况下,目标的整体校验和将与源文件夹的校验和不同。

您可以通过以下方式模拟此场景:

我从同一个“Linux”文件夹中创建了 Linux.tar.gz 和 Linux_1.tar.gz。不同之处在于 Linux_1.tar.gz 是在“Linux”文件夹包含一个额外的文本文件时生成的。

所以上面的场景模拟了当 Linux_1.tar.gz 被复制但在目标 Linux.tar.gz 中只剩下一个文本文件要复制时被中断

现在,当我比较这两个文件的校验和时,我看到

$ cksum Linux.tar.gz
756656601 1037079 Linux.tar.gz

$ cksum Linux_1.tar.gz
2598429125 1037184 Linux_1.tar.gz

所以上面的输出显示了不同的校验和值,表明文件副本不正确。

5.标准输出的校验和

该命令提供了一个功能,用户可以只键入“cksum”或“cksum-”并在标准输入上写入,然后按 Ctrl+D 几次。这种方式 cksum 给出了输入时输入的数据的校验和。

$ cksum
Lets check the checksum1135634677 23

在上面的例子中,我们实际上计算了字符串“Lets check the checksum”的校验和。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。