【问题标题】:Cryptography: Turning a String array into a single string密码学:将字符串数组转换为单个字符串
【发布时间】:2016-03-03 16:23:27
【问题描述】:

我正在创建一个小型宠物密码学项目,并正在从文本文件中读取文本,在每行位于数组中时对其进行修改,然后将其提交回其文本文件。问题是将字符串添加回文件,因为文本文件的当前文本已被删除,就像程序现在的样子一样。更具体地说,我想将数组中的所有字符串合并为一个字符串,这就是我认为错误所在。这是我写的代码。

static void Main(string[] args)
    {
        string[] getAllText = File.ReadAllLines("H:\\BetaText.txt");

        File.WriteAllText("H:\\BetaText.txt", string.Concat(Lock(getAllText)));
        System.Diagnostics.Process.Start("H:\\BetaText.txt");
    }

Lock 只是我程序中的一个方法,它返回一个加密的字符串数组。确认文本文件已正确解析,并且修改返回确实返回了我想要的数组。问题仍然是我的 string.Concat() 语句。我确实知道如何使用多行语句来解决这个问题,但我想避免这种情况并了解为什么 Concat() 语句没有按照我认为的方式工作。我还使用了带有 "" 分隔符的 string.Join 方法。浏览 StackOverflow 我还没有看到这个问题的答案,根据 MSDN 文档,我认为我不应该遇到这个问题。谢谢。

【问题讨论】:

  • 您发布的代码不会只将单个项目放入字符串[]中吗?似乎您需要在File.ReadAllLines 的字符串结果中的某个分隔符上执行Split() 方法,以便在字符串[] 中获取多个项目。连接单个 string[] 项只会返回一个字符串。
  • 加密数组中的每个字符串是否有特殊原因,您可以将整个文件读入一个字节[],加密,然后写回加密的字节?
  • 那么string.Concat 会返回什么,您希望它返回什么?
  • @Russ:当我使用ReadAllLines 拉取文本文件的每一行时,它都会添加到数组中的一个单独的字符串中
  • @series0ne 我的目的是学习如何使用这种方法来使用加密,然后再转向更好的方法。当我到达那一步时,我将进行代码审查。最好现在就学习如何用简单的方法来做,一旦我掌握了最好的方法,再学习如何做。此外,我还不习惯修改字节,因为我还没有处理单个字节。

标签: c# arrays string


【解决方案1】:

您可以使用String.Join 将字符串数组连接成单个字符串。

String.Join ("", getAllText);

你也可以使用Aggregate

getAllText.Aggregate((c, n) => string.Format("{0}{1}", c, n);

使用聚合,您可以构建更复杂的示例。例如,这是你可以用逗号分隔它们的方法

getAllText.Aggregate((c, n) => string.Format("{0}, {1}", c, n));

【讨论】:

  • 我以前没有见过这种方法,也不知道如何使用它。你能举例说明fn 是什么吗?我查过 MSDN 但我不完全明白。
  • 我将f 更改为n。我将其理解为c-current set 和n-下一个元素。试试这个链接stackoverflow.com/questions/7105505/…
  • 当我们有string.Joinstring.Concat 时,我完全没有理由像这样使用Aggregate
  • 使用Aggregate 代替string.Concatstring.Join 的一个问题是每次迭代都会创建一个新的临时字符串实例。那是浪费。 string.Concatstring.Join 方法可以优化为使用 StringBuilder 或更好的方法。
【解决方案2】:

或者简单地用','连接。如果您愿意,请选择其他分隔符

 var writeText = string.Join(", ", Lock(getAllText).Select(v => v.ToString()));
 File.WriteAllText("H:\\BetaText.txt", writeText);

【讨论】:

  • 也按照描述进行了尝试。输出是一样的。一个空的文本文件。
  • 尝试更新的答案并检查 writeText 是否为空?
【解决方案3】:

所以你正在做的是逐行读取文件到string[],然后加密每一行,然后将这些行提交回文件中。

就个人而言,我认为你的方法是错误的(直觉,但这就是原因)

File.ReadAllLines 通过使用换行符(Environment.NewLine"\r\n""\n"...)拆分文件来创建一个数组 - 如果您的加密算法恰好将某些特定字节加密为换行符会发生什么? - 突然之间你的换行符不同了 - 因此反过来做基本上会失败(我认为,因为解密文件“可能”使用不同的换行符)

更好的解决方案是:

byte[] unencryptedBytes = Encoding.UTF8.GetBytes(File.ReadAllText(filename));
byte[] encryptedBytes = Lock(unencryptedBytes);
File.WriteAllText(filename, Encoding.UTF8.GetString(encryptedBytes));

我知道这在技术上不是您要求的(对不起) - 我只是有这种直觉,您正在做的事情可能行不通。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-24
    • 2011-06-18
    • 1970-01-01
    • 2017-11-27
    相关资源
    最近更新 更多