例如我有
String Text = "ABCDEFGHIJKLMNOPQ";
运行一些代码进入
String[] text1 = "AOCN";
String[] text2 = "JQBF";
String[] text3 = "DMG";
String[] text4 = "HPI";
String[] text5 = "KEL";
然后一些代码将其恢复到
这可能吗? 我想要实现的是将溢出的字符随机存储到5个不同的字符串数组中,并使用代码将其还原为原始文本String Text =“ABCDEFGHIJKLMNOPQ”;
答案 0 :(得分:1)
对于任意字符串,并假设您的分布是真正随机的,那么除非您以某种方式存储随机因子,否则将无法重新组合原始字符串。这让我想起了Write-Only-Memory。
答案 1 :(得分:1)
假设对数组的“随机”字母分配请求是针对伪随机(或者,可能是表面上任意的)分配因此是可逆的,一种技术是基本上使用{ {3}}。
该算法将类似于:
然后通过颠倒这两个步骤获得原始文本。
(编辑)
转置密码密钥可以包含从1
到n
的伪随机数流,其中n
是要将输入字符串分成的字符串数。因此,扩展算法的内容如下:
p
的伪随机数列表m
,其中m
是输入字符串的长度。 i
,请将输入字符串中的i
字母分配给输出字符串编号p[i]
。重新组合原始字符串:
i
,请从字符串编号i
中的下一个未使用的字母中获取字符串中的p[i]
字母。答案 2 :(得分:0)
是的,您可以按字符迭代:
using System;
class Program
{
static void Main()
{
const string s = "Hello!";
// Option 1
foreach (char c in s)
{
Console.WriteLine(c); // Your treatment here
}
// Option 2
for (int i = 0; i < s.Length; i++)
{
Console.WriteLine(s[i]); // Your treatment here
}
}
}
你可以使用它来连接(治疗porcess):
if (some_condition) text1 += s[i];
然后在Your treatment here
部分中,您可以使用C#提供的基本随机函数。只要您不更改seed
,就可以检索用于生成子字符串的序列,并可能还原它...
例如,可能是这样的:
int seed = 12;
List<int> lst = new List<int>();
// Repeat that until you processed the whole string
// At the mean time, skip the characters already indexed
while (lst.Count != s.Length) {
int n = new Random(seed).Next(0, s.Length);
if (!lst.Contains(n)) {
text1 += s[n];
lst.Add(n);
}
}
最后,lst
是您恢复流程的关键。
然后你生成子字符串的方式和恢复原始字符串的算法也取决于你...你完全是免费的。
注意: 关于处理chunks
问题,请参阅Simon
的答案。
答案 3 :(得分:0)
试试这个:
static void Main(string[] args)
{
string Text = "ABCDEFGHIJKLMNOPQ";
int chunk = new Random().Next(1,Text.Length/2);
var result= Split(Text,chunk);
Console.WriteLine("Splited:");
foreach (var word in result)
{
Console.WriteLine(word);
}
string toOld = "";
Console.WriteLine("Returned:");
toOld = result.Aggregate((i, j) => i + j);
Console.WriteLine(toOld);
Console.ReadLine();
}
static List<string> Split(string str, int chunkSize)
{
var re = Enumerable.Range(0, str.Length / chunkSize)
.Select(i => str.Substring(i * chunkSize, chunkSize)).ToList() ;
var temp = re.Aggregate((i, j) => i + j);
if (temp.Length < str.Length)
{
var last = re.Last();
last += str.Substring(temp.Length, str.Length - temp.Length);
re[re.Count-1] = last;
}
return re;
}
你可以控制块大小