Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> кодирование, вектор 
:(
    Опции темы
mes
Дата 25.1.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 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


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0432 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.