Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Софт
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2012, 21:48   #1
Чайничек.
Пользователь
 
Регистрация: 07.06.2011
Сообщений: 11
По умолчанию кодирование/декодирование кода хемминга

обращаюсь ко всем, кто имел дело с кодами хемминга. может у кого то сохранились исходники для кодирования и декодирования кода хемминга (9,5) или (15,11)?
Чайничек. вне форума Ответить с цитированием
Старый 27.10.2012, 22:22   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Погугли по запросу "Код Хэмминга исходники" - в инете полно информации. Можно даже для начала поиском по форуму воспользоваться, прежде чем к гуглю обращаться - наверняка Вы не первый с таким вопросом.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 27.10.2012, 23:11   #3
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Ну, не сохранились, но всегда же можно написать?
Код:
#define GetBit(buf, pos) (buf[(pos)/8] & (1 << (7-((pos)%8))))
#define SetBitOne(buf, pos) (buf[(pos)/8] |= (1 << (7-((pos)%8))))
#define SetBitZero(buf, pos) (buf[(pos)/8] &= (0xFF ^ (1 << (7-((pos)%8)))))
#define SetBit(buf, pos, value) ((value) ? SetBitOne(buf, pos) : (SetBitZero(buf, pos)))
#define IsDegreeOf2(x) (!((x)^((x)-1)^(2*(x)-1)))

void HammingEncode(const char* inBuf, char* outBuf, size_t length){
	size_t outCur=1;
	for(size_t i=1; i<=length; ++i, ++outCur){
		while(IsDegreeOf2(outCur)) ++outCur;
		SetBit(outBuf, outCur, GetBit(inBuf, i) ? 1 : 0);
	}
	size_t outLength = outCur-1;
	for(size_t c=1; c<=outLength; c<<=1){
		int acc=0;
		for(size_t j=c+1; j<=outLength; ++j)
			if((j & c) != 0) acc^= GetBit(outBuf, j) ? 1 : 0;
		SetBit(outBuf, c, acc);
	}
}

bool HammingDecode(const char* inBuf, char* outBuf, size_t inLength){
	size_t error=0;
	for(size_t c=1; c<=inLength; c<<=1){
		int acc=0;
		for(size_t j=c; j<=inLength; ++j)
			if((j & c) != 0) acc^= (GetBit(inBuf, j) ? 1 : 0);
		if(acc!=0) error ^= c;
	}

	size_t outCur=1;
	for(size_t i=1; i<=inLength; ++i, ++outCur){
		while(IsDegreeOf2(i)) ++i;
		if(error==i) SetBit(outBuf, outCur, GetBit(inBuf, i) ? 0 : 1);
		else SetBit(outBuf, outCur, GetBit(inBuf, i) ? 1 : 0);
	}
	
	return error==0;
}
Abstraction вне форума Ответить с цитированием
Старый 28.10.2012, 13:36   #4
Чайничек.
Пользователь
 
Регистрация: 07.06.2011
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Погугли по запросу "Код Хэмминга исходники" - в инете полно информации. Можно даже для начала поиском по форуму воспользоваться, прежде чем к гуглю обращаться - наверняка Вы не первый с таким вопросом.
Искала везде, где только можно. Ничего рабочего не нашлось. Теорию я понимаю, а вот с программированием беда
Чайничек. вне форума Ответить с цитированием
Старый 28.10.2012, 13:38   #5
Чайничек.
Пользователь
 
Регистрация: 07.06.2011
Сообщений: 11
По умолчанию

это что за язык? Си? По какому алгоритму вы делали?
Чайничек. вне форума Ответить с цитированием
Старый 28.10.2012, 16:29   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Искала везде, где только можно. Ничего рабочего не нашлось
Да нет, полно всякого, и даже вполне рабочего - именно по тому запросу, который я Вам написал.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 28.10.2012, 18:47   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Сообщение от Чайничек. Посмотреть сообщение
это что за язык? Си? По какому алгоритму вы делали?
Язык - C++. Алгоритм... какой алгоритм? Описание кода Хэмминга, фактически. Смотрите:
Код:
//inBuf - исходный битовый массив, outBuf - результирующий, length - число бит в исходном массиве
void HammingEncode(const char* inBuf, char* outBuf, size_t length){
	size_t outCur=1;
        //Вначале переносим биты исходного массива...
	for(size_t i=1; i<=length; ++i, ++outCur){
                //...оставляя незаполненными позиции, соответствующие степеням 2
		while(IsDegreeOf2(outCur)) ++outCur;
                //Простое копирование из исходного массива в результирующий
		SetBit(outBuf, outCur, GetBit(inBuf, i) ? 1 : 0);
	}

        //Теперь запоминаем, где закончился результирующий массив (он длиннее исходного)
	size_t outLength = outCur-1;
        //И идём по незаполненным позициям...
	for(size_t c=1; c<=outLength; c<<=1){
                //...подсчитывая контрольный бит
		int acc=0;
                //Для всех тех битов за контрольным,...
		for(size_t j=c+1; j<=outLength; ++j)
                        //...в двоичной записи номера которых единица на нужном месте
			if((j & c) != 0) acc^= GetBit(outBuf, j) ? 1 : 0;
                //Записываем контрольный бит
		SetBit(outBuf, c, acc);
	}
}
Abstraction вне форума Ответить с цитированием
Старый 28.10.2012, 20:27   #8
Чайничек.
Пользователь
 
Регистрация: 07.06.2011
Сообщений: 11
По умолчанию

компилятор выдает 32 ошибки в коде ...
Чайничек. вне форума Ответить с цитированием
Старый 29.10.2012, 22:40   #9
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Сообщение от Чайничек. Посмотреть сообщение
компилятор выдает 32 ошибки в коде ...
И? У меня всё работало (MSVS 2010). Какие ошибки, я по юзерпику не определю.
Abstraction вне форума Ответить с цитированием
Старый 20.05.2013, 20:01   #10
zero125
Новичок
Джуниор
 
Регистрация: 20.05.2013
Сообщений: 3
По умолчанию

1) 2.23 Определить контрольные и информационные биты в заданном двоичном сообщении методом Хемминга.
2)Запишите на языке Pascal программу с использованием процедур (функций) для решения задачи 2.23. Оформите решение как фрагмент полу-ченных результатов.
zero125 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi Кодирование Хемминга zverek06 Фриланс 6 26.06.2012 23:21
Pascal, кодирование, декодирование информации pashka182 Паскаль, Turbo Pascal, PascalABC.NET 8 31.01.2012 09:56
Кодирование/Декодирование кодом ROT47 Jakudzafan Общие вопросы C/C++ 2 10.02.2011 14:37
Кодирование методом Хемминга Yuliya363 Помощь студентам 2 20.12.2010 09:38
Кодирование и декодирование .тхт extrimportal Общие вопросы Delphi 1 05.05.2009 18:47