校验和算法实现。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 校验和算法实现
# 《计算机网络 自顶向下方法》3.3.2 的例子
# 0110011001100000
# 0101010101010101
# 1000111100001100
# 校验和为 1011010100111101
import re
from typing import List
max_check_sum = 65535
def get_check_sum(nums: List[int]) -> int:
if not nums:
print('数据为空,无法计算校验和')
return 0
result = 0
for num in nums:
result += num
# 如果溢出,则回滚
if result > max_check_sum:
result -= max_check_sum
result = max_check_sum ^ result
return result
def print_help() -> None:
print('\n*** 校验和算法实现 ***\n')
print('计算请输入 c(alculate)')
print('退出请输入 q(uit)')
print('查看帮助请输入 h(elp)')
print('\n**********************\n')
def main():
print_help()
index = 1
nums = []
while True:
message = input(f'请输入第 {index} 个数:')
if message.lower() in {'c', 'calculate'}:
# 计算校验和
check_sum = get_check_sum(nums)
if check_sum:
print(f'校验和为', format(check_sum, 'b'))
index = 1
nums = []
elif message.lower() in {'q', 'quit'}:
# 退出程序
exit()
elif message.lower() in {'h', 'help'}:
# 打印帮助
print_help()
elif re.match('^[01]{16}$', message):
# 检查输入格式
index += 1
nums.append(int(message, 2))
else:
print('请输入长度为 16 的二进制数')
if __name__ == '__main__':
main()