любитель
   
Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006
Репутация: 79 Всего: 250
|
вот сделал небольшую "библиотечку" (в стиле си с элементами с++) с тестовым примером , для пользования хеммингом Добавлено @ 15:28| Код | // unpack_bit.h #pragma once #include <iostream>
typedef unsigned char unpack_bit;
void char_to_bits8 (unsigned char c, unpack_bit* bits) { for (int i=0; i<8; ++i) bits[i] = 1 & (c >> (7-i));
} unsigned char bits8_to_char (unpack_bit* bits) { unsigned char c = 0; for (int i=0; i<8; ++i) c |= bits[i] << (7-i); return c; }
void print_bits (const unpack_bit* bits, int count, const char *sep ="" ) // sep - разделитель { for (int i=0; i<count; ++i) std::cout <<int(bits[i]) << sep; }
|
| Код | // hamming.h #pragma once #include "unpack_bit.h"
void hamming ( unpack_bit *bits, int bits_cnt, unpack_bit *ham, int ham_cnt, unpack_bit * M ) // bits - указатель на биты данных // bits_cnt - кол-во элементов данных // ham - указатель на возвращаемую последовательность // ham_bits - длина результа // М - порождающая матрица [ham_cnt, bits_cnt] как линейная последовательность бит { for( int i = 0; i < ham_cnt; ++i ) { ham[i] = 0; for( int j = 0, ; j < bits_cnt; ++j ) ham[i] ^= bits[j] & M[i*bits_cnt+j]; } }
int unhamming (unpack_bit *ham, int ham_cnt, unpack_bit *bits, int bits_cnt, unpack_bit * S, unpack_bit *I ) // bits - указатель на биты данных // bits_cnt - кол-во элементов данных // ham - указатель на возвращаемую последовательность // ham_bits - длина результа // I - матрица [ bits_cnt, ham_cnt] получения информационных битов // S - матрица [ ham_cnt-bits_cnt, ham_cnt] получения синдрома { // получаем синдром : unsigned s=0; int snd_cnt = ham_cnt-bits_cnt; for( int j = 0; j < snd_cnt; ++j ) for( int i = 0; i < ham_cnt; ++i ) s ^= (ham[i] & S[j*ham_cnt+i])<<j;
// если есть ошибка, востанавливаем порченный бит : if (s) ham[s-1]^=1;
// получаем данные : for( int j = 0, ; j < bits_cnt; ++j ) { bits[j] = 0; for( int i = 0; i < ham_cnt; ++i ) bits[j] ^= ham[i] & I[j*ham_cnt+i]; }
return s; }
|
матрицы только для кодирования 4х битового сообщения : | Код | //hamming_matrix.h #pragma once #include "unpack_bit.h"
unpack_bit Hamming_M_7x4[7][4] = { { 1,1,0,1 } , { 1,0,1,1 } , { 1,0,0,0 } , { 0,1,1,1 } , { 0,1,0,0 } , { 0,0,1,0 } , { 0,0,0,1 } };
unpack_bit Hamming_S_3x7[3][7] = { { 1,0,1,0,1,0,1 } , { 0,1,1,0,0,1,1 } , { 0,0,0,1,1,1,1 } };
unpack_bit Hamming_I_4x7[4][7] = { { 0,0,1,0,0,0,0 } , { 0,0,0,0,1,0,0 } , { 0,0,0,0,0,1,0 } , { 0,0,0,0,0,0,1 } };
|
| Код | // hamming.cpp или main.cpp #include <iostream> #include "unpack_bit.h" #include "hamming.h" #include "hamming_matrix.h"
int main() {
srand (1);
for (char q=0; q!='n' && q!='N'; std::cin >> q ) { std::cout <<std::endl;
// случайное число unpack_bit data[4] = { 0 }; for (int i=0; i<4; ++i) data[i] = rand() & 1; std::cout << "data : "; print_bits (data, 4); std::cout <<std::endl;
// хeмминг : unpack_bit ham[7] = { 0 } ; hamming (data, 4, ham,7, Hamming_M_7x4[0]) ; std::cout << "ham : "; print_bits (ham, 7); std::cout <<std::endl;
// портим случайный бит : int e = rand ()%8; if (e) ham[e-1]^=1; std::cout <<"error : " <<e << std::endl; std::cout <<"ham (corrupted) : "; print_bits (ham, 7); std::cout <<std::endl;
// анхeмминг: unpack_bit unham[4] = { 0 }; int s = unhamming (ham,7, unham,4, Hamming_S_3x7[0], Hamming_I_4x7[0]); std::cout << "syndrom : " <<s << std::endl; std::cout << "ham (recovered) : "; print_bits (ham, 7); std::cout <<std::endl; std::cout << "unham : "; print_bits (unham, 4); std::cout <<std::endl;
std::cout << "repeat (y/n)? "; } }
|
Это сообщение отредактировал(а) mes - 25.1.2009, 17:51
|