是否有一种方法随机分离字符串到不同的字符串数组,并得到相同的相同的字符串

本文关键字:字符串 数组 分离 随机 方法 一种 是否 | 更新日期: 2023-09-27 18:18:54

例如

String Text = "ABCDEFGHIJKLMNOPQ";

运行一些代码进入

String[] text1 = "AOCN";
String[] text2 = "JQBF";
String[] text3 = "DMG";
String[] text4 = "HPI";
String[] text5 = "KEL";
然后用一些代码把它返回到

String Text = "ABCDEFGHIJKLMNOPQ";

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

是否有一种方法随机分离字符串到不同的字符串数组,并得到相同的相同的字符串

假设将字母"随机"分配到数组的请求是针对伪随机(或者,可能是表面上任意的)分配的,因此是可逆的,这样做的一种技术本质上是使用换位密码。

算法应该是这样的:

  1. 对输入文本执行换位密码。
  2. 将转置后的文本拆分到数组中。

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

(编辑)

换位密码密钥可以由从1n的伪随机数流组成,其中n为输入字符串被分割成的字符串数。因此,扩展后的算法如下:

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

重新组合原字符串:

  1. 对于所有i,从字符串编号p[i]的下一个未使用的字母中获取字符串中i的第一个字母。

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

try this:

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;
    }

可以控制块大小

可以逐字符迭代:

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