1s补码校验和如何用于错误检测?

时间:2011-04-09 21:18:32

标签: checksum

只需添加位即可生成校验和。如何使1s补充的额外步骤有用吗?

我理解这个理论。我知道如何计算1s补码,我知道如何添加补语使得结果全1。

我想看一个如何检测错误的简单示例。

5 个答案:

答案 0 :(得分:19)

我相信您正在寻找的示例here

我们做1的补码的原因是当1的补码被加到所有值的总和上,并且结果被修整为机器的位长度(上例中的16位),它是全部1分的。 CPU有一个功能可以取1的数字补码,而取1的1的补码全是0。

原因:CPU不喜欢使用比特,除了通常使用的块之外。因此,添加两个64位数可能需要1个周期,但单独检查该数字的所有位将需要更多(在一个简单的循环中,可能高达8x64个循环)。 CPU还能够轻松地获取1的补码,并检测最后一次计算的结果为零,而不检查单个位和分支。所以基本上,这是一个优化,让我们可以非常快速地检查校验和。由于大多数数据包都很好,因此我们可以动态检查校验和,并将数据更快地传送到目的地。

答案 1 :(得分:3)

示例,您需要在UDP数据包中发送三个单词。

0110011001100000
0101010101010101
1000111100001100

发送方的UDP执行所有16位总和的1s补码 话。这些16位字的前两个之和是

0110011001100000
+
0101010101010101
--> 1011101110110101 

将第三个单词添加到上面的总和中,请注意,最后一次添加有溢出,这是溢出的

--> 0100101011000010

通过将所有0转换为1并将所有1转换为0来获得1s补码。

因此,总和0100101011000010的1s补码是1011010100111101,它成为校验和。在接收器处,添加了所有四个16位字,包括校验和。如果没有错误引入数据包,那么接收器的总和将是1111111111111111。如果其中一个位是0,那么我们就知道错误已经引入了数据包。

答案 2 :(得分:1)

通过“添加位”我假设你的意思是计算奇偶校验位。根据{{​​3}},对于奇偶校验和,“未检测到两位错误的概率是1 / n”,而使用模数和(例如1s补码)“两位错误将发生的概率未检测到的有点不到1 / n。“

this Wikipedia entry on checksums讨论了如何计算1s补码(最常用于TCP / IP)。

答案 3 :(得分:0)

校验和的补码(位反转)至少有两种用途。

  1. 简化了校验和验证过程

例如,如果最终校验和为56,则补码为199。将它们加在一起,结果为255。推理:通过对最终校验和进行补码,当包括时,最终结果将始终为255。总和计算中的校验和数字。第二次用255执行补码将产生0,对于当时的CPU,这是一种更有效的方法来确认校验和有效,而不必比较两个数字。

  1. 允许检测到一个不可检测的错误

计算n个零的消息将产生校验和为零。这意味着由零组成的合法消息与应该被检测为错误的内存丢失或擦除情况没有区别。在这种情况下,通过对最终校验和补充0,结果将改为255,从而阻止零结果仍然有效。

答案 4 :(得分:-8)

Checksum对于网络非常重要,因为提到了partickmdnet。基本上,对于在IP协议中传输的每个数据报,都存在提前计算并传输的校验和。如果在数据报的数据部分中甚至一个位被破坏并且发送不正确,则在接收路由器处计算的校验和将与数据报提供的校验和不同。这告诉路由器数据报已损坏(数据或校验和部分本身),路由器将丢弃数据报。