每64个字符插入一个回车符

本文关键字:一个 回车 64个 字符 插入 | 更新日期: 2023-09-27 18:24:56

我有一个Base64编码的字符串,如下所示:

SWwgw6l0YWl0IHVuIHBldGl0IG5hdmlyZS [...] 0IG5hdmlyZSA=

输入字符串可以很大(>1MB)。出于互操作性的原因,我需要每64个字符在这个大字符串中添加一个回车。

我的第一个猜测是使用字符串生成器,每64个字符使用一次方法"AppendLine",如下所示:

string InputB64_Without_CRLF = "SWwgw6l0YWl0IHVuIHBldGl0IG5hdmlyZS [...] 0IG5hdmlyZSA=";
int BufferSize = 64;
int Index = 0;
StringBuilder sb = new StringBuilder();
while (Index < strInput.Length) {
    sb.AppendLine(InputB64_Without_CRLF.Substring(Index, BufferSize));
    Index += BufferSize;
}
string Output_With_CRLF = sb.ToString();

但我担心这部分代码的性能。有没有更好的方法可以在不重建另一个字符串的情况下,将一个字符插入字符串的某个位置?

每64个字符插入一个回车符

有没有更好的方法可以在不重建另一个字符串的情况下,在某个位置将字符插入字符串

.NET字符串是不可变的,这意味着一旦创建它们,就不能对其进行修改。

因此,如果您想在字符串中插入字符,除了之外,没有其他方法可以创建新的字符串。StringBuilder可能是实现这一点最有效的方法,因为它允许您根据需要执行任意多的字符串构建步骤,并且最终只创建一个新字符串。

除非您在实际场景中确实注意到了性能问题,否则请保留当前的解决方案。至少从性能的角度来看,它在我看来还不错。

需要进一步考虑的要点:

如果你仍然对你的解决方案不满意,我只能想出一些小事情来提高你当前的解决方案的效率:

  • 预先声明StringBuilder所需的容量,这样就不必调整其后备字符缓冲区的大小:

    var additionalCharactersCount = Environment.NewLine.Length * (input.Length / 64); 
    var sb = new StringBuilder(capacity: input.Length + additionalCharactersCount);
    
  • 先将完整的输入字符串插入StringBuilder,然后每隔64个字符重复插入.Insert(…, Environment.NewLine)

    我完全不确定这是否真的会提高执行速度,但它消除.Substring导致的重复字符串创建。自己衡量它是否比您的解决方案快。

您的代码并不低效,尝试节省100ms或更少的时间通常是不值得的。但是,如果您担心的话,这里有另一种稍微有效的方法,可以每64个字符插入一行新行(有时是''r''n,而不仅仅是''r''n)

        string Output_With_CRLF = InputB64_Without_CRLF;
        //Start at last index so that our new line inserts do not move the text, making sure to input every 64th of the original string
        //This looks stupid to divide and multiply again, but it works because it is integer division
        StringBuilder sb = new StringBuilder(InputB64_Without_CRLF);
        for (int i = (InputB64_Without_CRLF.Length / 64) * 64; i >= 64; i -= 64)
            sb.Insert(i, Environment.NewLine);

这只会比您的原始代码效率高一点点,您可能不会注意到太大的差异。

在与stakx交谈后,我有了这个想法。通过使用StringBuilder,您不会一次又一次地创建太多字符串。StringBuilder非常高效,可以在不创建更多对象的情况下处理其插入。