Имею следующую задачу:
Зашифрованный текст должен храниться в файле текстового формата вместе с ключом. Перед записью в файл зашифрованного текста и ключа предварительно перемешайте записываемые массивы (в получаемом массиве выделяются фиксированные позиции для хранения символов ключа; для корректной сборки ключа необходимо указать длину ключа в символах и шаг фиксированных позиций, т.е. через сколько символов шифрованного текста находятся символы ключа; указанные признаки можно записать в качестве первых двух байтов файла или же в других позициях файла).
Мне помогли с алгоритмом и с кодом:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Input
{
class Program
{
static void Main(string[] args)
{
int step, word;
string text, key, result = string.Empty;
Console.Write("Enter Text : ");
text = Console.ReadLine();
Console.Write("Enter Key : ");
key = Console.ReadLine();
Console.Write("Enter Step : ");
step = int.Parse(Console.ReadLine());
// MIX ARRAY
word = 0;
if (step <= text.Length)
{
for (int i = 0; i < key.Length; i++)
{
result += key.Substring(i, 1);
for (int k = 0; k < step; k++)
{
try
{
result += text.Substring(word, 1);
word++;
}
catch
{
break;
}
}
}
if (word < text.Length)
{
result += text.Substring(word, (text.Length - word));
}
}
Console.WriteLine("Result Text : " + result);
// DECIPHER ARRAY
Console.WriteLine("text: " + text);
Console.WriteLine("key: " + key);
Console.ReadKey();
}
}
}
Только теперь я не могу правильно расшифровать перемешанную строку.
Входные данные: длина ключа в символах (key.Length), шаг (step), перемешанная строка (result).
Выходные данные: текст (text), ключ (key).
Ну готовых алгоритмов я не помню. Но можно легко написать свой.
static IEnumerable<T> Mix<T>(IEnumerable<T> s1, IEnumerable<T> s2, int step1, int step2 = 1)
{
using (var e1 = s1.GetEnumerator())
using (var e2 = s2.GetEnumerator())
{
bool firstFinished = false, secondFinished = false;
while (!firstFinished && !secondFinished)
{
if (!firstFinished)
{
for (int i = 0; i < step1; i++)
{
if (!e1.MoveNext())
firstFinished = true;
yield return firstFinished ? default(T) : e1.Current;
}
}
if (!secondFinished)
{
for (int i = 0; i < step2; i++)
{
if (!e2.MoveNext())
secondFinished = true;
yield return secondFinished ? default(T) : e2.Current;
}
}
}
}
}
Неполные группы дополняются значением default(T)
.
Пробуем:
var result = Mix(new [] {1, 2, 3, 4, 5, 6, 7, 8}, new[] {100, 200}, 3).ToArray();
foreach (var v in result) Console.Write(v + " ");
Результат:
1 2 3 100 4 5 6 200 7 8 0 0
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Пытаюсь создать калькулятор на Windows Forms, С#Добавил кнопки для ввода чисел и следовательно требуется ограничить ввод пользователя в TextBox
Добрый деньРеализовываю плагин под AutoCAD с запуском из программы, в результате чего использую библиотеку UcerControl'ов ну то есть просто в ней...