只需添加位即可生成校验和.如何使用1s补充的额外步骤有用吗?
我理解这个理论.我知道如何计算1s补码,我知道如何添加补码使结果全1.
我想看一个如何检测错误的简单示例.
Saj*_*jid 20
我相信你正在寻找的例子可以在这里找到.
我们做1的补码的原因是,当将1的补码加到所有值的总和上,并将结果调整到机器的位长度(上例中为16位)时,它全是1.CPU有一个功能可以取1的数字补码,而取1的1的补码全是0.
原因是:CPU不喜欢使用比特,除了通常使用的块之外.因此,添加两个64位数可能需要1个周期,但单独检查该数字的所有位将需要更多(在一个简单的循环中,可能高达8x64个循环).CPU还能够轻松地获取1的补码,并检测最后一次计算的结果为零,而不检查单个位和分支.所以基本上,这是一个优化,让我们可以非常快速地检查校验和.由于大多数数据包都很好,因此我们可以动态检查校验和,并将数据更快地传输到目的地.
小智 6
例如,您需要发送 UDP 数据包中的三个字。
0110011001100000
0101010101010101
1000111100001100
Run Code Online (Sandbox Code Playgroud)
发送端的UDP对所有16位字的和进行补1。这些 16 位字的前两个之和为
0110011001100000 +
0101010101010101 =
1011101110110101
Run Code Online (Sandbox Code Playgroud)
将第三个单词添加到上面的总和中,请注意,最后的添加有溢出,它被包裹起来
--> 0100101011000010
Run Code Online (Sandbox Code Playgroud)
1的补码是通过将0全部转为1并将1全部转为0来获得的。
因此,和的 1 补码0100101011000010
是1011010100111101
,它成为校验和。在接收器处,所有四个 16 位字都被添加,包括校验和。如果数据包中没有引入错误,那么接收器处的总和显然将为1111111111111111
。如果其中一位为 0,则我们知道数据包中已引入错误。
校验和的补码(位反转)至少有两种用途。
例如,如果最终校验和字节为 56,则补码(位反转)将为 199。将它们加在一起,结果为 255。推理:通过对最终校验和进行补码,当包含总和计算中的校验和数字。对 255 进行第二次补码将产生 0,对于当时的 CPU 来说,这是一种更有效的方法来确认校验和有效,而无需比较两个数字。
计算 n 个零的消息会产生零的校验和。这意味着由零组成的合法消息与内存丢失或擦除情况无法区分,应将其检测为错误。在本例中,通过对最终校验和 0 求补,结果变为 255,从而防止结果 0 仍然有效。
归档时间: |
|
查看次数: |
29861 次 |
最近记录: |