cycychenyi
4/2/2020 - 4:33 PM

校验和算法实现。

校验和算法实现。

#!/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()