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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2011, 16:15   #1
prod
Пользователь
 
Регистрация: 04.10.2011
Сообщений: 14
По умолчанию Перевод из C++ в C#

Неочень пока что разбираюсь в C#. Очень нужна ваша помощь по переводу следующего кода:
Код:

#include <iostream>
#include <algorithm>
#include <fstream>
 
using namespace std;
 
/* сгенерировать случайный шифроалфавит */
string generate_alphabet()
{
    string alphabet = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
 

 
    random_shuffle( alphabet.begin(), alphabet.end() );
 
    return alphabet;
}
 
/* инкрементировать значения символов строки str value раз. */
string shift( const string &str, int value )
{
    string ret( str );
 
    for( size_t i = 0; i < value; i++ )
    {
        for( size_t u = 0; u < str.length(); u++ )
        {
            ret[u]++;
 
            if( ret[u] > '~' )
               ret[u] -= '~' - ' ';
        }
    }
 
    return ret;
}
 
bool encrypt( string infile, string outfile, string key, string alphabet )
{
    ifstream ifs( infile );
    ofstream ofs( outfile );
 
    if( !ifs.is_open() || !ofs.is_open() )
    {
        ifs.close();
        ofs.close();
        return false;
    }
 
    string::iterator key_it = key.begin();
 
    for( char ch = ifs.get(); ch != EOF && !ifs.eof(); ch = ifs.get() )
    {
        size_t pos = alphabet.find( ch );
 
        if( pos == string::npos )
        {
            ofs.put( ch );
            continue;
        }
 
        string new_alph = shift( alphabet, (*key_it) - ' ' );
 
        ofs.put( new_alph[ ch - ' ' ] );
 
        key_it++;
 
        if( key_it == key.end() )
           key_it = key.begin();
    }
 
    ifs.close();
    ofs.close();
 
    return true;
}
 
bool decrypt( string infile, string outfile, string key, string alphabet )
{
    ifstream ifs( infile );
    ofstream ofs( outfile );
 
    if( !ifs.is_open() || !ofs.is_open() )
    {
        ifs.close();
        ofs.close();
        return false;
    }
 
    string::iterator key_it = key.begin();
 
    for( char ch = ifs.get(); ch != EOF && !ifs.eof(); ch = ifs.get() )
    {
        size_t pos = alphabet.find( ch );
 
        if( pos == string::npos )
        {
            ofs.put( ch );
            continue;
        }
 
        string new_alph = shift( alphabet, (*key_it) - ' ' );
 
        pos = new_alph.find( ch );
        ofs.put( pos + ' ' );
 
        key_it++;
 
        if( key_it == key.end() )
           key_it = key.begin();
    }
 
    ifs.close();
    ofs.close();
 
    return true;
}
 

}
prod вне форума Ответить с цитированием
Старый 04.10.2011, 17:00   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

prod

Как-то так, но не проверял, так шта если будут ошибки, придется тебе их искать самостоятельно.

random_shuffle

Код:
public static IEnumerable<T> Shuffle<T>(this IList<T> list)
{
	var indexes = Enumerable.Range(0, list.Count).ToArray();
	var generator = new Random();

	for (var i = 0; i < list.Count; ++i)
	{
		var position = generator.Next(i, list.Count);
		yield return list[indexes[position]];
		indexes[position] = indexes[i];
	}
}
generate_alphabet

Код:
private const string Alphabet = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";

public IEnumerable<char> GenerateAlphabet()
{
	return Alphabet.ToCharArray().Shuffle();
}
shift

Код:
public string Shift(string s, int value)
{
	var sb = new StringBuilder(s);

	for (var i = 0; i < value; i++)
	{
		for (var u = 0; u < s.Length; u++)
		{
			++sb[u];
					
			if (sb[u] > '~')
				sb[u] -= (char) ('~' - ' ');
		}
	}

	return sb.ToString();
}
encrypt

Код:
public void Encrypt(string inFile, string outFile, string key, string alphabet)
{
	var index = 0;
	var sb = new StringBuilder();

	using (var sr = new StreamReader(inFile))
	{
		while (!sr.EndOfStream)
		{
			var ch = (char) sr.Read();
			if (ch == -1)
				break;

			if (Alphabet.IndexOf(ch) == -1)
			{
				sb.Append(ch);
				continue;
			}

			var newAlph = Shift(alphabet, key[index] - ' ');
			sb.Append(newAlph[ch - ' ']);

			index++;
			if (index == key.Length)
				index = 0;
		}
	}

	using (var sw = new StreamWriter(outFile))
	{
		sw.Write(sb.ToString());
	}
}
decrypt

абсолютно аналогично, что что лень (Ж
Rififi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод AdDa Помощь студентам 1 01.06.2011 03:22
перевод з С++ на С Zewer Помощь студентам 2 13.01.2011 16:51
перевод KostyaS Общие вопросы C/C++ 0 05.01.2011 14:52
Перевод FVGK-2009 Visual C++ 5 26.10.2010 07:54
Перевод из Кб в Мб и т.д. okgo Паскаль, Turbo Pascal, PascalABC.NET 8 18.11.2008 21:03