Python实现下面的题:本题的目标是用本章描述的标准 CRC 算法实现一个错误检测机制。编写两个程序:generator 和verifier。 generator 程序从标准输人读取一行 ASCII 文本该文本包含由0和1组成的n 位消息。第二行是一个k位多项式也是以 ASCII 码表示的。程序输出到桥准输出设备上的是一行 ASCII 码由n+k个0和1组成表示被发送的消息。然后它输出多项式就像
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
原文地址: https://www.cveoy.top/t/topic/bD5d 著作权归作者所有。请勿转载和采集!