-3

例如我有

String Text = "ABCDEFGHIJKLMNOPQ";

运行一些代码进入

String[] text1 = "AOCN";
String[] text2 = "JQBF";
String[] text3 = "DMG";
String[] text4 = "HPI";
String[] text5 = "KEL";

然后一些代码让它恢复

字符串文本 = "ABCDEFGHIJKLMNOPQ";

这可能吗?我想要实现的是将溢出的字符随机存储到 5 个不同的字符串数组中,并使用代码将其恢复为原始文本

4

4 回答 4

1

对于任意字符串,并假设您的分布是真正随机的,那么除非您以某种方式存储随机因子,否则将无法重新组装原始字符串。这让我想起了只写内存。

于 2013-06-19T02:42:11.597 回答
1

假设对数组的字母“随机”分配的请求是伪随机(或者,也许是表面上的任意)分配,因此是可逆的,实现这一点的一种技术是本质上使用转置密码

该算法将类似于:

  1. 对输入文本运行转置密码。
  2. 将转置的文本拆分为数组。

然后通过颠倒这两个步骤获得原始文本。

(编辑)

转置密码密钥可以由伪随机数流组成,1其中nn输入字符串要被分割成的字符串的数量。因此,扩展算法将如下所示:

  1. p生成长度为 的伪随机数列表m,其中m是输入字符串的长度。
  2. 对于所有i,将i输入字符串中的第 th 个字母分配给输出字符串编号p[i]

要重新组装原始字符串:

  1. 总而言之ii从字符串 number 中下一个未使用的字母中获取字符串中的第 th 个字母p[i]
于 2013-06-19T02:47:41.950 回答
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
        }
    }
}

您可以使用它来连接(治疗过程):

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的回答。

于 2013-06-19T02:39:59.367 回答
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;

    }

你可以控制块大小

于 2013-06-19T03:42:11.367 回答