#P2318. 求出检验和!
求出检验和!
题目描述
小明在学习《计算机网络》这门课程的时候,了解到:网络上的信号最终都是通过物理传输线路进行传输的,如果高层没有采用差错控制,那么物理层传输的数据信号是可能有差错的。 小明想知道 有没有什么办法检验接受的信息是否出错呢? 这时候,神奇的小汪就出现了,他告诉小明有一个神奇的东西可以帮助接收端去判断接收的信息是否有误。
这个神奇的东西就是检验和! 具体原理如下: 现在假设有一个IP报文的首部如下所示(都是16进制数): 4500 003c 1c46 4000 4006 b1e6 ac10 0a63 ac10 0a0c 而其中b1e6为发送端所求出的检验和 而在计算之前我们先将发送端求出的检验和的16位全部置0
4500 -> 0100010100000000
003c -> 0000000000111100
1c46 -> 0001110001000110
4000 -> 0100000000000000
4006 -> 0100000000000110
0000 -> 0000000000000000 // 先全部置零,最后再把算出来的结果附加上
ac10 -> 1010110000010000
0a63 -> 0000101001100011
ac10 -> 1010110000010000
0a0c -> 0000101000001100
4500 -> 0100010100000000
003c -> 0000000000111100
453C -> 0100010100111100 // 第一次计算结果
453C -> 0100010100111100 // 第一次计算结果 加 后16位
1c46 -> 0001110001000110
6182 -> 0110000110000010 // 第二次计算结果
6182 -> 0110000110000010 // 第二次计算结果 加 后16位
4000 -> 0100000000000000
A182 -> 1010000110000010 // 第三次计算结果
A182 -> 1010000110000010 // 第三次计算结果 加 后16位
4006 -> 0100000000000110
E188 -> 1110000110001000
E188 -> 1110000110001000
AC10 -> 1010110000010000
18D98 -> 11000110110011000 // 这里产生了一次溢出,根据回卷规则,把溢出位加到最后
18D98 -> 11000110110011000
8D99 -> 1000110110011001 // 进行类似16位加法。。。就不再重述了
8D99 -> 1000110110011001
0A63 -> 0000101001100011
97FC -> 1001011111111100
97FC -> 1001011111111100
AC10 -> 1010110000010000
1440C -> 10100010000001100 // 由产生了进位,继续回卷
1440C -> 10100010000001100
440D -> 0100010000001101
440D -> 0100010000001101
0A0C -> 0000101000001100
4E19 -> 0100111000011001
//4e19取反即为
1011000111100110 恰为b1e6说明计算正确
小汪告诉小明这是发送端发出的检验和,接收端只需要将所有的报文相加,如果求出的结果的16位均为1则结果正确,否则结果错误。
而此时处在另一个平行宇宙的小明遇到了史无前例的危机,邪恶的僵尸博士将小明发送的信息中的校验和全部吃掉了,而唯一能拯救他的小美虽然收到了信息,但因为无法判断信息是否有误并且还在忙着保卫戴夫而无法脱开身去救援小明,于是小明向你求救!!
请帮助小明计算出所有报文的检验和。
输入格式
ip报文长度最多可能为100000条 数据保证报文长度为4的整数倍,例如图中蓝色高亮部分共有40个十六进制数(包括检验和)
图片中 高亮蓝色字体中 header checksum 即发送端求得检验和为b70c
输出格式
请根据这些ip报文计算出相应的检验和并输出其二进制形式。
样例
45 00
00 3c
1c 46
40 00
40 06
ac 10
0a 63
ac 10
0a 0c
1011000111100110
45 48 00 34 d2 7c 40 00 31 06 df 77 8f d0 c0 a8 90 02
1011011100001100
提示
提示:若没有思路 csdn搜索 bitset 有惊喜
by 夏夜
2022/6/4 《计算机网络》课设有感
数据纯手搓自创 如有问题 请务必联系我! QQ: 464856041