generator.py:

import sys

# 将多项式转换为二进制数组
def polynomial_to_binary(polynomial):
    binary = []
    for c in polynomial:
        binary.extend([int(b) for b in bin(ord(c))[2:].zfill(8)])
    return binary

# 将二进制数组转换为多项式
def binary_to_polynomial(binary):
    polynomial = ""
    for i in range(0, len(binary), 8):
        c = chr(int("".join([str(b) for b in binary[i:i+8]]), 2))
        polynomial += c
    return polynomial

# 计算 CRC
def crc(message, polynomial):
    # 将多项式转换为二进制数组
    generator = polynomial_to_binary(polynomial)

    # 在消息末尾添加 k-1 个零
    message += [0] * (len(generator) - 1)

    # 用生成多项式除以消息
    for i in range(len(message) - len(generator) + 1):
        if message[i] == 1:
            for j in range(len(generator)):
                message[i+j] ^= generator[j]

    # 返回带有 CRC 的消息
    return message

# 读取输入
message = [int(b) for b in input().strip()]
polynomial = input().strip()

# 计算 CRC
crc_message = crc(message, polynomial_to_binary(polynomial))

# 输出带有 CRC 的消息和多项式
print("".join([str(b) for b in crc_message]), binary_to_polynomial(polynomial_to_binary(polynomial)), sep='\n')

verifier.py:

import sys

# 将多项式转换为二进制数组
def polynomial_to_binary(polynomial):
    binary = []
    for c in polynomial:
        binary.extend([int(b) for b in bin(ord(c))[2:].zfill(8)])
    return binary

# 将二进制数组转换为多项式
def binary_to_polynomial(binary):
    polynomial = ""
    for i in range(0, len(binary), 8):
        c = chr(int("".join([str(b) for b in binary[i:i+8]]), 2))
        polynomial += c
    return polynomial

# 计算 CRC
def crc(message, polynomial):
    # 将多项式转换为二进制数组
    generator = polynomial_to_binary(polynomial)

    # 在消息末尾添加 k-1 个零
    message += [0] * (len(generator) - 1)

    # 用生成多项式除以消息
    for i in range(len(message) - len(generator) + 1):
        if message[i] == 1:
            for j in range(len(generator)):
                message[i+j] ^= generator[j]

    # 如果余数为零,返回 True,否则返回 False
    return message.count(1) == 0

# 读取输入
message_and_crc = [int(b) for b in input().strip()]
polynomial = input().strip()

# 分离消息和 CRC
message = message_and_crc[:-len(polynomial)]
crc = message_and_crc[-len(polynomial):]

# 验证 CRC 并输出结果
if crc(message, polynomial_to_binary(polynomial)):
    print("Message is correct")
else:
    print("Message is incorrect")

alter.py:

import sys

# 将多项式转换为二进制数组
def polynomial_to_binary(polynomial):
    binary = []
    for c in polynomial:
        binary.extend([int(b) for b in bin(ord(c))[2:].zfill(8)])
    return binary

# 将二进制数组转换为多项式
def binary_to_polynomial(binary):
    polynomial = ""
    for i in range(0, len(binary), 8):
        c = chr(int("".join([str(b) for b in binary[i:i+8]]), 2))
        polynomial += c
    return polynomial

# 计算 CRC
def crc(message, polynomial):
    # 将多项式转换为二进制数组
    generator = polynomial_to_binary(polynomial)

    # 在消息末尾添加 k-1 个零
    message += [0] * (len(generator) - 1)

    # 用生成多项式除以消息
    for i in range(len(message) - len(generator) + 1):
        if message[i] == 1:
            for j in range(len(generator)):
                message[i+j] ^= generator[j]

    # 返回带有 CRC 的消息
    return message

# 读取输入
message_and_crc = [int(b) for b in input().strip()]
polynomial = input().strip()

# 分离消息和 CRC
message = message_and_crc[:-len(polynomial)]
crc = message_and_crc[-len(polynomial):]

# 反转指定比特
arg = int(sys.argv[1])
message[arg-1] = 1 - message[arg-1]

# 输出带有错误的消息和多项式
print("".join([str(b) for b in message + crc]), binary_to_polynomial(polynomial_to_binary(polynomial)), sep='\n')

使用示例:

假设有一个名为 input.txt 的文件,其内容如下:

11010110111010001111
10011

则可以使用以下命令运行:

python generator.py < input.txt | python verifier.py

输出应该是:

Message is correct

如果使用以下命令运行:

python generator.py < input.txt | python alter.py 3 | python verifier.py

输出应该是:

Message is incorrect
Python实现下面的题:本题的目标是用本章描述的标准 CRC 算法实现一个错误检测机制。编写两个程序:generator 和verifier。 generator 程序从标准输人读取一行 ASCII 文本该文本包含由0和1组成的n 位消息。第二行是一个k位多项式也是以 ASCII 码表示的。程序输出到桥准输出设备上的是一行 ASCII 码由n+k个0和1组成表示被发送的消息。然后它输出多项式就像

原文地址: https://www.cveoy.top/t/topic/bD5d 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录