class TransmissionSimulator:
def __init__(self):
pass
def parity_encode(self, data):
return data + str(data.count('1') % 2)
def parity_decode(self, code):
data, parity = code[:-1], code[-1]
if data.count('1') % 2 != int(parity):
return data, "Ошибка обнаружена (четность нарушена)"
return data, "Ошибок не обнаружено"
def triple_encode(self, data):
return "".join([bit * 3 for bit in data])
def triple_decode(self, code):
restored = ""
for i in range(0, len(code), 3):
block = code[i:i+3]
restored += "1" if block.count('1') >= 2 else "0"
return restored, "Восстановлено по правилу большинства"
def hamming_encode(self, data):
return hamming74_encode(data)
def hamming_decode(self, code):
syn = hamming74_syndrome(code)
if syn == 0:
return code[2:6], "Ошибок нет" # Извлекаем данные d1..d4 (индексы 2,3,4,5)
else:
corrected = hamming74_correct(code)
return corrected[2:6], f"Исправлена ошибка в позиции {syn}"
def simulate(self, data, method):
print(f"\n{'='*50}")
print(f"Моделирование передачи: Метод = {method}, Данные = {data}")
print(f"{'='*50}")
# 1. Кодирование
if method == "parity":
encoded = self.parity_encode(data)
elif method == "tripling":
encoded = self.triple_encode(data)
elif method == "hamming":
encoded = self.hamming_encode(data)
print(f"1. Закодированное сообщение: {encoded}")
# 2. Внесение ошибки (случайная позиция)
broken = list(encoded)
err_pos = random.randint(0, len(broken) - 1)
broken[err_pos] = "0" if broken[err_pos] == "1" else "1"
broken = "".join(broken)
print(f"2. Внесена ошибка в позицию {err_pos + 1}: {broken}")
# 3. Декодирование и проверка
if method == "parity":
decoded, status = self.parity_decode(broken)
elif method == "tripling":
decoded, status = self.triple_decode(broken)
elif method == "hamming":
decoded, status = self.hamming_decode(broken)
print(f"3. Результат декодирования: {decoded}")
print(f"4. Статус: {status}")
print(f"5. Исходные данные: {data}. Совпадение: {'ДА' if decoded == data else 'НЕТ'}")
# Запуск модуля
sim = TransmissionSimulator()
sim.simulate("1011", "parity")
sim.simulate("1011", "tripling")
sim.simulate("1011", "hamming")