- •Оглавление
- •1 Теоретическая справка 4
- •2 Ход работы 7
- •Введение
- •1 Теоретическая справка
- •1.1 Принцип кодов Хемминга
- •1.2 Маркировка кодов Хемминга
- •2.1 Выбор среды для реализации программной модели
- •2.2 Описание используемых функций и методов
- •1.3 Алгоритмы кодирования и декодирования
- •2 Ход работы
- •Заключение
- •Ответы на контрольные вопросы
- •Приложение а
Приложение а
«Код main.c»
using System;
using System.Collections.Generic;
using System.Linq;
class HammingCodeSimulation
{
static void Main()
{
Console.Write("Введите строку: ");
string input = Console.ReadLine();
// Преобразование в ASCII-код
List<string> binaryBlocks = ToAscii(input);
// Код Хемминга
List<string> encodedBlocks = binaryBlocks.Select(EncodeHamming).ToList();
// Ошибка 50%
List<string> transmittedBlocks = encodedBlocks.Select(SimulateTransmission).ToList();
// Исправление ошибки
List<string> correctedBlocks = transmittedBlocks.Select(CorrectHamming).ToList();
// Декодирование
List<string> decodedBinary = correctedBlocks.Select(DecodeHamming).ToList();
// Преобразование обратно в строку
string output = ConvertFromBinaryAscii(decodedBinary);
k1:
Console.WriteLine($"\nПринятая строка: {output}");
// Выбор символа
Console.Write("\nВведите индекс символа для анализа (0 - {0}): ", input.Length - 1);
int index = int.Parse(Console.ReadLine());
Console.WriteLine($"\nАнализ символа '{input[index]}' под индексом {index}:");
Console.WriteLine($"1. Двоичное ASCII: {binaryBlocks[index]}");
Console.WriteLine($"2. Код Хемминга: {encodedBlocks[index]}");
Console.WriteLine($"3. После передачи: {transmittedBlocks[index]}");
Console.WriteLine($"4. После исправления: {correctedBlocks[index]}");
Console.WriteLine($"5. Расшифрованный байт: {decodedBinary[index]}");
Console.WriteLine($"6. Итоговый символ: {(char)Convert.ToByte(decodedBinary[index], 2)}");
goto k1;
}
public static List<string> ToAscii(string input)
{
List<string> binaryList = new List<string>();
foreach (char c in input)
{
string binary = Convert.ToString((byte)c, 2).PadLeft(8, '0');
binaryList.Add(binary);
}
return binaryList;
}
public static string ConvertFromBinaryAscii(List<string> binaryList)
{
return new string(binaryList.Select(b => (char)Convert.ToByte(b, 2)).ToArray());
}
// Хэмминг
static string EncodeHamming(string data)
{
int[] bits = new int[12];
bits[2] = data[0] - '0';
bits[4] = data[1] - '0';
bits[5] = data[2] - '0';
bits[6] = data[3] - '0';
bits[8] = data[4] - '0';
bits[9] = data[5] - '0';
bits[10] = data[6] - '0';
bits[11] = data[7] - '0';
bits[0] = bits[2] ^ bits[4] ^ bits[6] ^ bits[8] ^ bits[10];
bits[1] = bits[2] ^ bits[5] ^ bits[6] ^ bits[9] ^ bits[10];
bits[3] = bits[4] ^ bits[5] ^ bits[6] ^ bits[11];
bits[7] = bits[8] ^ bits[9] ^ bits[10] ^ bits[11];
return string.Join("", bits);
}
// Ошибка в случайном бите
static string SimulateTransmission(string code)
{
Random rnd = new Random();
char[] bits = code.ToCharArray();
if (rnd.Next(2) == 0)
{
int pos = rnd.Next(12);
bits[pos] = bits[pos] == '0' ? '1' : '0';
}
return new string(bits);
}
// Исправление ошибок
static string CorrectHamming(string code)
{
int[] bits = code.Select(c => c - '0').ToArray();
int p1 = bits[0] ^ bits[2] ^ bits[4] ^ bits[6] ^ bits[8] ^ bits[10];
int p2 = bits[1] ^ bits[2] ^ bits[5] ^ bits[6] ^ bits[9] ^ bits[10];
int p4 = bits[3] ^ bits[4] ^ bits[5] ^ bits[6] ^ bits[11];
int p8 = bits[7] ^ bits[8] ^ bits[9] ^ bits[10] ^ bits[11];
int errorPosition = p1 * 1 + p2 * 2 + p4 * 4 + p8 * 8;
if (errorPosition != 0)
{
bits[errorPosition - 1] ^= 1; // Исправление
}
return string.Join("", bits);
}
// Вывод
static string DecodeHamming(string code)
{
int[] bits = code.Select(c => c - '0').ToArray();
string data = $"{bits[2]}{bits[4]}{bits[5]}{bits[6]}{bits[8]}{bits[9]}{bits[10]}{bits[11]}";
return data;
}
}
Томск 2025
