参考链接

二进制反码求和

UDP 检验和的回卷是什么意思?

Python 计算 UDP 检验和

目录

1. 前言说明

2. 例子分析

3. 相关代码

4. 结果展示

5. 心得总结

一、前言说明 ↶

在看完教材 5-50 题目的习题解答,稍微懂了一点二进制反码求和。手算总是觉得很容易出错,用程序帮我们计算,尽最大可能减少计算错误的发生。所以,我想用 Python 简易实现二进制反码求和计算 UDP 检验和的过程,顺便巩固和复习一些 Python 语法。

二、例子分析 ↶

这里把题目和较详细解答过程直接贴在这里【思路 + 过程】

50. 把教材上的图 5-7 计算 UDP 检验和的例子自己具体演算一下,看是否能够得出书上的计算结果。

可以使用两种方法进行二进制反码求和的运算。一种方法是把这 14 行的 16 位数据一起从低位到高位逐位相加。另一种方法是把这 14 行的 16 位数据两行两行地相加(即二进制反码求和)

我们这里使用后一种方法,这里要相加 13 次。

第 1 行和 第 2 行相加,得 10100001 01111011

再和第 3 行相加,得 1 01001100 011111110。请注意,最左边(最高位)的 1 是进位得到的 1,这要和最低位相加。因此和第 3 行相加后,得 01001100 01111111。最低位的 1 就是由最高位的进位得到的。这叫做 “回卷”。

再和第 4 行相加,得 01011010 10001010。

再和第 5 行相加,得 01011010 10011011。

再和第 6 行相加,得 01011010 10101010。

再和第 7 行相加,得 01011110 11101001。

再和第 8 行相加,得 01011110 11110110。

再和第 9 行相加,得 01011111 00000101。

第 10 行是全 0,不用再计算相加。

再和第 11 行相加,得 10110011 01001010。

再和第 12 行相加,得 00000110 10011111。这里的最低位的 1 由最高位的进位回卷得到的。

再和第 13 行相加,得 01001111 11101101。

再和第 14 行相加,得 10010110 11101101。这就是二进制反码求和的结果。把这个结果求反码(1 换成 0 而 0 换成 1),得出:01101001 00010010。这就是应当写在检验和字段的数。和书上给出的结果是一致的。

UDP 用户数据报传送到接收端后,再进行检验和计算。这就是把收到的 UDP 用户数据报连同伪首部(以及可能的填充全零字节)一起,按二进制反码求这些 16 位字的和。当无差错时其结果应当全 1。否则就表明有差错出现,接收方就应丢弃这个 UDP 用户数据报(也可以上交应用层,但附上出现差错的警告)。

三、相关代码 ↶

简易实现:

def checkBits(raw_data, bits):

# 检查原来的数据是否满足 bits 位

for (a, b) in enumerate(raw_data):

if len(b) != bits:

print("NO.{}: {}".format(a+1, b))

return False

return True

def format_print(string, bits):

# 对按bits字符串切片,加空格

length = len(string)

new_list = []

for i in range(bits, length+1, bits):

new_list.append(string[i-bits:i])

remain = length % bits

if remain != 0:

new_list.append(string[-remain:])

return ' '.join(new_list)

class Binary_complement_sum():

def __init__(self, raw_bits, bits):

self.raw_bits = raw_bits

self.bits = bits

self.total = ''

self.inv_dict = {'0': '1',

'1': '0'}

def calculate(self):

# 用二进制反码求和的方法加起来

total = self.raw_bits[0]

for i in self.raw_bits[1:]:

total = str(bin(int(total, 2) + int(i, 2)))[2:]

if len(total) > self.bits:

total = str(bin(int(total[-self.bits:], 2) + 1))[2:]

self.total = total

return total

def inverse(self):

# 求它的反码

inv_code = ''

for i in self.total:

inv_code += self.inv_dict[i]

return inv_code

if __name__ == '__main__':

raw_data = ['1001100100010011',

'0000100001101000',

'1010101100000011',

'0000111000001011',

'0000000000010001',

'0000000000001111',

'0000010000111111',

'0000000000001101',

'0000000000001111',

'0000000000000000',

'0101010001000101',

'0101001101010100',

'0100100101001110',

'0100011100000000']

bits = 16

# 检查位数是否满足 bit 位

if checkBits(raw_data, bits):

bin_com_sum = Binary_complement_sum(raw_data, bits)

total = bin_com_sum.calculate()

inv_code = bin_com_sum.inverse()

print("二进制反码运算求和:{}".format(format_print(total, 8)))

print("将得出的结果求反码:{}".format(format_print(inv_code, 8)))

else:

print("请检查原始数据是否输入正确!")

四、结果展示 ↶

raw_data = ['1001100100010011',

'0000100001101000',

'1010101100000011',

'0000111000001011',

'0000000000010001',

'0000000000001111',

'0000010000111111',

'0000000000001101',

'0000000000001111',

'0000000000000000',

'0101010001000101',

'0101001101010100',

'0100100101001110',

'0100011100000000']

结果:

# 上面例子的检验

二进制反码运算求和:10010110 11101101

将得出的结果求反码:01101001 00010010

>>>

raw_data = ['1001100100010010',

'0000100001101001',

'1010101100000010',

'0000111000001010',

'0000000000010001',

'0000000000001111',

'0000010000111111',

'0000000000001101',

'0000000000001111',

'0000000000000000',

'0101010001000101',

'0101001101010100',

'0100100101001111',

'0100011100000000']

结果:

二进制反码运算求和:10010110 11101100

将得出的结果求反码:01101001 00010011

>>>

例题来自:二进制反码求和举例

五、心得总结 ↶

实验的例子太少,导致没办法验证代码的可靠性。但是用教材上的例子实验,结果表明没有问题。通过对题目解答的了解和阅读,按二进制反码求和开始懂一些了。边学变练,记得才牢。好记性不如烂笔头。ヾ(◍°∇°◍)ノ゙ 加油吧

点我回顶部 ☚

Fin.

python二进制反码例题_Python 简易实现二进制反码求和相关推荐

  1. python二进制反码例题_python中的进制转换和原码,反码,补码

    python中的进制转换和原码,反码,补码 计算机文件大小单位 b = bit 位(比特) B = Byte 字节 1Byte = 8 bit #一个字节等于8位 可以简写成 1B = 8b 1KB ...

  2. python车辆管理系统_Python简易版停车管理系统

    本文实例为大家分享了Python简易版停车管理系统的具体代码,供大家参考,具体内容如下 import time # 最大停车数 max_car = 100 # 当前停车数,初始为0 cur_car = ...

  3. python写水仙花_python简易实现任意位数的水仙花实例

    如下所示: # -*- coding: utf-8 -*- # 水仙花数是指一个 n 位正整数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身. # 要求:打印输出所有的"水仙 ...

  4. python 贪吃蛇_python简易贪吃蛇

    python简易贪吃蛇 前言 开始 献上代码 from tkinter.messagebox import showinfo as msg from random import randint as ...

  5. 如何在python制作计算器_Python简易计算器制作方法代码详解

    主要用到的工具是Python中的Tkinter库 比较简单 直接上图形界面和代码 引用Tkinter库 from tkinter import * 建立主窗口对象 window=Tk() #设置窗口对 ...

  6. python集合例题_python基础练习题、集合的讲解、一些公关方法

    1.求100(含100)以内所有偶数的和 range(start,end,step)这个序列生成器,和那个切片的语法一样,含头不含尾,step是步长,这里就不需要在对j进行判断了,对于这些简单求奇数和 ...

  7. python集合例题_python练习题集合-2

    author:headsen chen date:2018-06-01 15:39:26 习题17,文件的更多操作 [root@localhost py]# echo 1234567890 >c ...

  8. python正则表达式例题_python—正则表达式实例

    #match函数应用 import re print(re.match("done|quit",'d!one!done')) print(re.match("\dcom& ...

  9. python回归分析例题_python编程线性回归代码示例

    用python进行线性回归分析非常方便,有现成的库可以使用比如:numpy.linalog.lstsq例子.scipy.stats.linregress例子.pandas.ols例子等. 不过本文使用 ...

最新文章

  1. Jmeter分布式部署如何操作
  2. java 下载后删除,在服务器端生成文件后,下载后并删除,改了后发现文件变成空白解决思路...
  3. C语言圈叉游戏,圈叉棋小游戏的简单实现代码
  4. 智能化视频开发神器来了,AV Pipeline Kit 架构解析
  5. TCP文件上传Java_Java 理解TCP通信案例:文件上传案例
  6. VS2012打开项目 提示Asp.net4.0未在web服务器上注册的解决方案
  7. 字节码指令之控制转移指令
  8. 如何开发出一款仿映客直播APP项目实践篇 -【原理篇】
  9. probability是什么意思_概率(Probability)的本质是什么?
  10. 数值计算与MATLAB微积分
  11. 图像的灰度化灰度值的读取Matlab
  12. TOEFL wordlist 4
  13. 如何简单又快速的清理C盘内存
  14. 一个对小学生的随机生成的四则运算试题
  15. 开课吧T31项目第8天
  16. 九宫怎么排列和使用_广告视频配音剪映零基础入门教程第二十三篇:剪辑之九宫格教程...
  17. 关于怎么在echarts飞机迁移图中换掉飞机图标
  18. ISO体系认证不符合项如何整改
  19. 《MATLAB智能算法30个案例》:第12章 免疫优化算法在物流配送中心选址中的应用
  20. 计算机vf基本知识,计算机等级考试VF基础知识部分

热门文章

  1. 计蒜课ctu2017
  2. 读书与读人生-《如何阅读一本书》的优秀读后感2300字
  3. 华云数据控股集团:科技创新服务为本 践行企业社会责任
  4. 前端面试题 回顾与复习(更新中)
  5. 数据结构的起航,用C语言实现一个简约却不简单的顺序表!(零基础也能看懂)
  6. 私库如何区分正式和测试环境独立的库
  7. a 标签之假链接 和假链接
  8. 永洪科技王桐:人生要么是一段大胆的冒险,要么什么都不是
  9. Plone ZEO 与 Nginx的配置
  10. 中国智能穿戴市场投资前景分析及供需格局研究预测报告