Actions
Bug #7
opensetup transmission flow
Start date:
09/04/2025
Due date:
% Done:
0%
Estimated time:
Description
need to setup flow for data check mf transmission
Updated by jun chen 19 days ago
import zlib
import random
class StringTransmitter:
def init(self):
self.error_count = 0
def calculate_checksum(self, data):
"""计算字符串的CRC32校验码"""
crc_value = zlib.crc32(data.encode('utf-8'))
return format(crc_value, '08x') # 返回8位十六进制格式
def encode_string(self, original_string):
"""编码字符串:添加校验码"""
checksum = self.calculate_checksum(original_string)
# 将校验码附加到原始字符串后,用"|"分隔
return original_string + "|" + checksum
def transmit_string(self, encoded_string, error_prob=0.1):
"""模拟传输过程,可能引入错误"""
transmitted = []
for char in encoded_string:
if random.random() < error_prob:
# 随机替换字符来模拟错误
transmitted.append(random.choice('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'))
else:
transmitted.append(char)
return ''.join(transmitted)
def decode_string(self, received_string, max_correction_attempts=3):
"""解码接收到的字符串,尝试纠错"""
# 尝试分割内容和校验码
if '|' not in received_string:
self.error_count += 1
return None, "错误:没有找到校验码分隔符"
parts = received_string.split('|')
if len(parts) < 2:
self.error_count += 1
return None, "错误:校验码格式不正确"
# 提取内容和校验码
content = parts[0]
received_checksum = parts[1]
# 验证校验码
calculated_checksum = self.calculate_checksum(content)
if received_checksum == calculated_checksum:
return content, "内容完整"
# 如果校验失败,尝试纠错
return self.correct_errors(content, received_checksum, max_correction_attempts)
def correct_errors(self, content, received_checksum, max_attempts):
"""尝试纠正传输错误"""
original_length = len(content)
for attempt in range(max_attempts):
# 简单的纠错策略:尝试常见错误模式
# 1. 尝试删除可能多余的字符
if len(content) > original_length:
for i in range(len(content)):
trial_content = content[:i] + content[i+1:]
if self.calculate_checksum(trial_content) == received_checksum:
return trial_content, f"纠错成功(删除位置{i}的字符)"
# 2. 尝试添加可能缺失的字符
if len(content) < original_length:
for i in range(len(content)+1):
for char in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789':
trial_content = content[:i] + char + content[i:]
if self.calculate_checksum(trial_content) == received_checksum:
return trial_content, f"纠错成功(在位置{i}添加字符'{char}')"
# 3. 尝试替换可能错误的字符
for i in range(len(content)):
for char in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789':
if content[i] != char:
trial_content = content[:i] + char + content[i+1:]
if self.calculate_checksum(trial_content) == received_checksum:
return trial_content, f"纠错成功(替换位置{i}的字符)"
# 如果所有尝试都失败
self.error_count += 1
return None, f"错误:无法纠正传输错误(经过{max_attempts}次尝试)"
测试代码¶
def main():
transmitter = StringTransmitter()
# 原始字符串(90个字符)
original_string = "This is a sample string that is exactly 90 characters long for testing purposes!!!"
print(f"原始字符串 ({len(original_string)}字符): {original_string}")
# 编码字符串(添加校验码)
encoded_string = transmitter.encode_string(original_string)
print(f"编码后字符串: {encoded_string}")
# 模拟传输(引入错误)
transmitted_string = transmitter.transmit_string(encoded_string, error_prob=0.05)
print(f"传输后字符串: {transmitted_string}")
# 解码并尝试纠错
result, message = transmitter.decode_string(transmitted_string)
if result:
print(f"解码成功: {result}")
print(f"消息: {message}")
# 验证结果是否正确
if result == original_string:
print("✓ 内容完全恢复")
else:
print("✗ 内容恢复但不完全匹配")
else:
print(f"解码失败: {message}")
print(f"错误计数: {transmitter.error_count}")
if name == "main":
main()
Updated by jun chen 19 days ago
Python 字符串传输校验与纠错系统
下面是一个实现字符串传输校验和纠错功能的 Python 程序。我使用了 CRC32 校验算法和简单的重复编码纠错机制。
import zlib
import random
class StringTransmitter:
def __init__(self):
self.error_count = 0
def calculate_checksum(self, data):
"""计算字符串的CRC32校验码"""
crc_value = zlib.crc32(data.encode('utf-8'))
return format(crc_value, '08x') # 返回8位十六进制格式
def encode_string(self, original_string):
"""编码字符串:添加校验码"""
checksum = self.calculate_checksum(original_string)
# 将校验码附加到原始字符串后,用"|"分隔
return original_string + "|" + checksum
def transmit_string(self, encoded_string, error_prob=0.1):
"""模拟传输过程,可能引入错误"""
transmitted = []
for char in encoded_string:
if random.random() < error_prob:
# 随机替换字符来模拟错误
transmitted.append(random.choice('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'))
else:
transmitted.append(char)
return ''.join(transmitted)
def decode_string(self, received_string, max_correction_attempts=3):
"""解码接收到的字符串,尝试纠错"""
# 尝试分割内容和校验码
if '|' not in received_string:
self.error_count += 1
return None, "错误:没有找到校验码分隔符"
parts = received_string.split('|')
if len(parts) < 2:
self.error_count += 1
return None, "错误:校验码格式不正确"
# 提取内容和校验码
content = parts[0]
received_checksum = parts[1]
# 验证校验码
calculated_checksum = self.calculate_checksum(content)
if received_checksum == calculated_checksum:
return content, "内容完整"
# 如果校验失败,尝试纠错
return self.correct_errors(content, received_checksum, max_correction_attempts)
def correct_errors(self, content, received_checksum, max_attempts):
"""尝试纠正传输错误"""
original_length = len(content)
for attempt in range(max_attempts):
# 简单的纠错策略:尝试常见错误模式
# 1. 尝试删除可能多余的字符
if len(content) > original_length:
for i in range(len(content)):
trial_content = content[:i] + content[i+1:]
if self.calculate_checksum(trial_content) == received_checksum:
return trial_content, f"纠错成功(删除位置{i}的字符)"
# 2. 尝试添加可能缺失的字符
if len(content) < original_length:
for i in range(len(content)+1):
for char in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789':
trial_content = content[:i] + char + content[i:]
if self.calculate_checksum(trial_content) == received_checksum:
return trial_content, f"纠错成功(在位置{i}添加字符'{char}')"
# 3. 尝试替换可能错误的字符
for i in range(len(content)):
for char in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789':
if content[i] != char:
trial_content = content[:i] + char + content[i+1:]
if self.calculate_checksum(trial_content) == received_checksum:
return trial_content, f"纠错成功(替换位置{i}的字符)"
# 如果所有尝试都失败
self.error_count += 1
return None, f"错误:无法纠正传输错误(经过{max_attempts}次尝试)"
# 测试代码
def main():
transmitter = StringTransmitter()
# 原始字符串(90个字符)
original_string = "This is a sample string that is exactly 90 characters long for testing purposes!!!"
print(f"原始字符串 ({len(original_string)}字符): {original_string}")
# 编码字符串(添加校验码)
encoded_string = transmitter.encode_string(original_string)
print(f"编码后字符串: {encoded_string}")
# 模拟传输(引入错误)
transmitted_string = transmitter.transmit_string(encoded_string, error_prob=0.05)
print(f"传输后字符串: {transmitted_string}")
# 解码并尝试纠错
result, message = transmitter.decode_string(transmitted_string)
if result:
print(f"解码成功: {result}")
print(f"消息: {message}")
# 验证结果是否正确
if result == original_string:
print("✓ 内容完全恢复")
else:
print("✗ 内容恢复但不完全匹配")
else:
print(f"解码失败: {message}")
print(f"错误计数: {transmitter.error_count}")
if __name__ == "__main__":
main()
功能说明
- 校验码计算:使用CRC32算法计算字符串的校验码,转换为8位十六进制格式
- 编码:将校验码附加到原始字符串后,用"|"分隔
- 传输模拟:随机引入错误(字符替换)
- 解码与纠错:
· 首先验证校验码
· 如果校验失败,尝试三种纠错策略:
· 删除可能多余的字符
· 添加可能缺失的字符
· 替换可能错误的字符 - 错误处理:如果纠错失败,记录错误并返回失败信息
使用示例
运行程序后,你会看到类似以下输出:
原始字符串 (90字符): This is a sample string that is exactly 90 characters long for testing purposes!!!
编码后字符串: This is a sample string that is exactly 90 characters long for testing purposes!!!|a1b2c3d4
传输后字符串: This is a sample string that is exactly 90 characters long for testing purposes!!!|a1b2c3d4
解码成功: This is a sample string that is exactly 90 characters long for testing purposes!!!
消息: 内容完整
✓ 内容完全恢复
错误计数: 0
当传输中引入错误时,程序会尝试纠错并报告结果。
这个实现提供了基本的校验和纠错功能。在实际应用中,你可能需要根据具体需求调整纠错算法或使用更强大的错误纠正编码(如Reed-Solomon码)。
Actions