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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2013, 22:52   #1
Merf1n
 
Регистрация: 08.12.2013
Сообщений: 4
Восклицание Новичок в С++, шифровка/дешифровка файлов

Код:
#include<iostream>
#include<fstream>
#include <io.h>
using namespace std;
#define symb unsigned char
void Coding(fstream &in, fstream &out);
void Decoding(fstream &in, fstream &out);
bool OpenFile (fstream& file,bool in);
symb Decode(symb c);
symb Code(symb c);

/****************************************************
* Функция проверяет имя файла на некорректные символы.	*
* Проверяет, может ли он открыться и открывает его	*
*****************************************************/
bool CheckFile(fstream& file,bool in,char str[])
{
		if(strchr(str,'.') ==NULL)
		strcat(str,".txt");
		for(short i=0;i<strlen(str);i++)
		if	((	strchr("<>*?|\"",str[i])!=NULL) 
			|| (str[i]==':' && i!=1 ) 
			|| (str[i]=='\\'&&((str[i+1]=='\\'||str[i+1]=='\0'))))
		{
			cout << "Incorrect symbols in filename\n";
			return false;
		}
		(in)?file.open(str, ios::in):file.open(str, ios::out);
		if(!file)
		{
		cout << "Can not open file \n";
			return false;
		}
		return true;
}

/***********************************************************************
* Функция запрашивает у пользователя имя файла (входного или выходного).	*
* Делает соответсвующие проверки							*
* В случае успеха, связывает файловый поток file с указанным файлом		*
************************************************************************/
bool OpenFile (fstream& file,bool in)
{
	char str[255];
	bool first=true;
	(in)?cout << "Enter input file name\n":cout << "Enter output file name\n";
	cin >> str;
	if(CheckFile(file,in,str))
		return true;
	else 
		return false;
}

/*****************************************************
* Функция кодирует символ c в соответствии с заданием*
******************************************************/
symb Code(symb c)


/*********************************************
* Функция декодирует закодированный символ с *
**********************************************/
symb Decode(symb c)
\
/*********************************************************
* Функция кодирует файл in и выводит результат в файл out*
**********************************************************/
void Coding(fstream &in, fstream &out)
{
	symb c;
	while(!in.eof())
	{
		c=in.get();
		if (c!='\n'&&c!='\0')
			out << Code(c);
		else 
			out << c;		
	}
	
}
void Decoding(fstream &in, fstream &out)
{
	symb c;
	while(!in.eof())
	{
		c=in.get();
		if (c!='\n' && c!='\0')
			out << Decode(c);
		else 
			out << c;
	}
}
void Choice(fstream& in, fstream& out)
{
	bool cont=true;
	cout << "To code or to decode ? c/d \n";
		do
		{
			cin.sync();
			switch(char c=cin.get())
			{
			case 'd':case'D':
				Decoding(in,out);
				break;
			case 'c':case'C':
				Coding(in,out);
				break;
			default:
				cout << "Error. Try again";
				cont=false;
			}
		}
		while(cont==false);
}

/***************************************
*		Главная функция.		*
*  Реализует пользовательский интерфейс	*
****************************************/
void main(int argc, char* argv[])
{
	fstream in,out;
	char c;
	bool first=true;   
	switch(argc)
	{
		case 1:
			if(OpenFile(in,true)==false)
				return;
			if(OpenFile(out,false)==false)
				return;
			Choice(in,out);
			break;
		case 2:
			if(CheckFile(in,true,argv[1])==false)
				return;
			if(OpenFile(out,false)==false)
				return;
			Choice(in,out);
			break;
		case 3:
			if(CheckFile(in,true,argv[1])==false)
				return;
			if(CheckFile(out,false,argv[2])==false)
				return;
			Choice(in,out);
			break;
		case 4:
			if(CheckFile(in,true,argv[1])==false)
				return;
			if(CheckFile(out,false,argv[2])==false)
				return;
			(argv[3]=="c")?Coding(in,out):Decoding(in,out);
			break;			
	}
	system("pause");
}
Помогите дописать программу, я не знаю как применять метод циклического сдвига на 2 право чётных битов относительно нечётных битов asci-кодов символов с инверсий нечётных битов
В коде функции объявлены, а если честно, то не знаю будет ли работать эта программа вообще
Спасибо за внимание!
Merf1n вне форума Ответить с цитированием
Старый 08.12.2013, 22:55   #2
Merf1n
 
Регистрация: 08.12.2013
Сообщений: 4
По умолчанию

Помогите 4 день с кодом мучаюсь и даже проверить не могу:С
Merf1n вне форума Ответить с цитированием
Старый 08.12.2013, 23:46   #3
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию


Я полагаю, схема битовых изменений при кодировании такая?
Код:

#define Mask_Even_6left 0xA8
#define Mask_Even_2right 0x02
#define Mask_Even_6right 0x2A
#define Mask_Even_2left 0x80
#define Mask_Odd 0x55
char cod(	char toEncode)
{	
	char oddXORed, evenFirst, evenSecond;

	oddXORed = toEncode & Mask_Odd;
	oddXORed = ~oddXORed;
	oddXORed &= Mask_Odd;

	evenFirst = (toEncode & Mask_Even_6left) >> 2;
	evenSecond = (toEncode & Mask_Even_2right) << 6;

	char toRet = oddXORed | evenFirst | evenSecond; 
	return toRet;
}

char decod(	char toDecode)
{	
	char oddXORed, evenFirst, evenSecond;

	oddXORed = ~(toDecode & Mask_Odd);
	oddXORed &= Mask_Odd;

	evenFirst = (toDecode & Mask_Even_6right) << 2;
	evenSecond = (toDecode & Mask_Even_2left) >> 6;

	char toRet = oddXORed | evenFirst | evenSecond; 
	return toRet;
}
Разбирайтесь, что тут происходит
Изображения
Тип файла: jpg schema.JPG (12.1 Кб, 112 просмотров)
Smogg вне форума Ответить с цитированием
Старый 09.12.2013, 00:14   #4
Merf1n
 
Регистрация: 08.12.2013
Сообщений: 4
По умолчанию

Спасибо
Постараюсь разобраться
Merf1n вне форума Ответить с цитированием
Старый 09.12.2013, 00:25   #5
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от Merf1n Посмотреть сообщение
Спасибо
Постараюсь разобраться
А для уверенности, что разобрались и для повышения производительности, чтобы на каждом вызове cod/decod() не конструировались временные переменные, всю эту шнягу напишите в одну строчку оператора return, т.е. что то типа:

return ~toEncode | toEncode & Mask_Odd &((toEncode & Mask_Even_6left) >> 2 ) | ((toEncode & Mask_Even_2right) << 6);

Последний раз редактировалось Smogg; 09.12.2013 в 05:23.
Smogg вне форума Ответить с цитированием
Старый 11.12.2013, 00:06   #6
Merf1n
 
Регистрация: 08.12.2013
Сообщений: 4
По умолчанию

Smogg, огромное вам спасибо, разобрался достаточно быстро
Не знаю сколько бы разбирался, если бы не вы
Еще раз спасибо
Merf1n вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
СИ шифровка и дешифровка Габриэлла Помощь студентам 1 29.11.2011 22:35
Шифрование/дешифровка Jaroslav.zp.ua Общие вопросы по Java, Java SE, Kotlin 0 09.05.2011 12:31
Шифровка и Дешифровка Claster Помощь студентам 4 27.03.2011 12:30
шифровка и дешифровка текста паролем s2dentishe Помощь студентам 3 21.12.2009 09:41
Дешифровка zvyagin1 Фриланс 3 02.12.2008 20:40