Лабораторная работа №4. Коды Хемминга

advertisement
ФГБОУ ВПО ИрГУПС
Кафедра: Информационные Системы
Лабораторная работа №4. Коды Хемминга
Написать программу расчет кодов Хемминга и программу для проверки
корректности входных данных.
Алгоритм работы первого модуля:





Открытие входного файла на чтение
Считывается байт
Байт кодируется кодом Хемминга
Результат добавляется к битовому буферу
Битовый буфер побайтно записывается в выходной файл. Записанные
биты удаляются из буфера.
 Переход на шаг 2 до окончания входного файла.
 Если в буфере остались незаписанные биты, то они добиваются до
байта нулями и записываются в выходной файл.
Алгоритм работы второго модуля:
 Открытие входного файла на чтение
 Считывается n-байт и добавляются к битовому буферу.
 Информация декодируется кодом Хемминга, если есть ошибка, то
вывод сообщения о позиции ошибки и завершение работы.
 Раскодированная и проверенная информация записывается в выходной
файл.
 Необработанные баты добавляются к битовому буферу.
 Переход на шаг 2 до окончания входного файла.
Теория.
Код Хемминга – это блочный код, позволяющий исправлять одиночные и
фиксировать двойные ошибки, разработанный Ричардом Хеммингом в
сороковых годах прошлого столетия.
В то время он работал в лаборатории Белла на электромеханической счетной
машине Bell Model V. Ввод данных в эту машину осуществлялся с помощью
перфокарт. Это была самая ненадежная часть вычислительной машины.
Перфокарты часто считывались неправильно. Исправление и обнаружение
ошибок ввода данных отнимало огромное количество времени, а
пропущенные ошибки могли привести к неверным результатам работы.
Желая застраховаться от возможных сбоев и ускорить процесс обработки
данных, Хемминг много работал над построением эффективных алгоритмов,
позволяющих быстро обнаруживать и исправлять ошибки, и в 1950 году
опубликовал способ кодирования, являющийся одним из самых известных на
сегодняшний день.
Идея кодов Хемминга заключается в разбиении данных на блоки
фиксированной длины и вводе в эти блоки контрольных бит, дополняющих
до четности несколько пересекающихся групп, охватывающих все биты
блока.
Ричард Хемминг рассчитал минимальное количество проверочных бит,
позволяющих однозначно исправлять однократные ошибки.
Если длина информационного блока, который требуется закодировать - m
бит. Количество контрольных бит, используемых для его кодирования, – k,
то закодированный блок будет иметь длину: n = m+k бит. Для каждого блока
такой длины возможны n различных комбинаций, содержащих ошибку.
Таким образом, для каждого передаваемого информационного блока может
существовать n–блоков, содержащих однократную ошибку, и один блок - без
ошибок.
Следовательно,
максимальное
количество
различных
закодированных блоков, содержащих не больше одной ошибки, будет:
2m(n+1), где n = m+k.
Создание кода Хемминга для 1 байта (8 бит)
Исходное сообщение [0][1][2][3][4][5][6][7]
Результат [X1][X2][0][X3][1][2][3][X4][4][5][6][7]
X1 = И0 + И1 + И3 + И4 + И6
X2 = И0 + И2 + И3 + И5 + И6
X3 = И1 + И2 + И3 + И7
X4 = И4 + И5 + И6 + И7
X рассчитывает по модулю 2
При проверке необходимо повторить расчет и проверить расчетные данные с
фактическими. Если результат не сходится, то значит есть как минимум одна
ошибка при передаче информации.
Пример 1. Преобразование Char в Byte и обратно.
Для кодировки по умолчанию мы можем использовать следующий код:
public static byte[] stringToBytesUTFCustom(String str) {
char[] buffer = str.toCharArray();
byte[] b = new byte[buffer.length << 1];
for(int i = 0; i < buffer.length; i++) {
int bpos = i << 1;
b[bpos] = (byte) ((buffer[i]&0xFF00)>>8);
b[bpos + 1] = (byte) (buffer[i]&0x00FF);
}
return b;
}
Каждый символ в Java занимает 2 байта, для преобразования строки в
байтовый эквивалент нужно перевести каждый символ строки в его
двухбайтовый эквивалент.
И обратно в строку:
public static String bytesToStringUTFCustom(byte[] bytes) {
char[] buffer = new char[bytes.length >> 1];
for(int i = 0; i < buffer.length; i++) {
int bpos = i << 1;
char c = (char)(((bytes[bpos]&0x00FF)<<8) + (bytes[bpos+1]&0x00FF));
buffer[i] = c;
}
return new String(buffer);
}
Download