字符串替换(C#)

3

使用c#编程。
我想将字符串中的每个字符替换为另一个字符(加密),但我需要一些帮助。我原本想使用两个数组,一个包含字母表,另一个包含替代值,但我意识到我需要用else-if语句来覆盖整个字母表的大小,这实在是太耗费时间了。我想知道是否有更简单,更快速的方法。这是我目前的代码

private string EncryptFn(string Sinput)
{
    string STencryptedResult = "Null for now";
    char[] CAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
    char[] Encrypt = "QWERTYUIOPASDFGHJKLZXCVBNM".ToCharArray();

    return STencryptedResult;
}

谢谢


但是你的 CAlphabet 只处理从 'A' 到 'Z' 的字符。那其他字符怎么办? - Jonathan Wood
我只打算加密字母字符,而不是数字和特殊字符等。 - FrodoBaggins
4
你为什么不使用内置的加密提供程序? - Simon Whitehead
3
你现在做的并不是加密,充其量只是一种密码。 - Joel Coehoorn
3
弗罗多·巴金斯,你应该与我们分享你的最终目标。如果这是一项作业任务,那么当前提供的解决方案是合适的。如果你想要安全地存储密码,你不应该加密它们,而应该进行哈希处理。如果你想要给朋友发送秘密消息,也有相应的解决方案。 - JoshVarty
显示剩余5条评论
3个回答

6
您可以使用一个字典:
var map = new Dictionary<char,char> {
  { 'A', 'Q' },
  { 'B', 'W' },
  // etc
};

然后,将每个字符映射成以下内容就变得非常容易了:
var result = new StringBuilder();
foreach( var fromChar in inputString ) {
  char toChar;
  if( ! map.TryGetValue(fromChar, out toChar) ) {
    // Do something with missing char
  }
  result.Append(toChar);
}

5

这并不是一种非常强大的加密方式,但是下面的版本将非常高效,并且需要非常少的数据来定义加密:

private string EncryptFn(string Sinput)
{
    string coding = "QWERTYUIOPASDFGHJKLZXCVBNM";

    StringBuilder result = new StringBuilder();
    foreach (char c in Sinput)
    {
        int index = (Char.ToUpper(c) - 'A');
        if (index >= 0 && index < coding.Length)
            result.Append(coding[index]);
        else
            result.Append(c);
    }
    return result.ToString();
}

int index = (c.ToUpper() - 'A'); 会导致错误:方法'ToUpper'没有接受0个参数的重载。 - FrodoBaggins
谢谢,已标记为答案! - FrodoBaggins
不,你将安德鲁的回答标记为答案。那没问题,但我期望我的代码表现比他的要好,并且声明需要输入的内容更少。 - Jonathan Wood
哦,我试图标记两个,抱歉:P。就我个人而言,我更喜欢你的答案,但也想给他一些认可。 - FrodoBaggins
我不介意哪个被标记为正确答案,因为它们都能得到所需的结果。但就性能而言,我尝试了一些基准测试(每个解决方案1000000次迭代),发现使用Char.ToUpper() 函数几乎会使运行时间翻倍,并使该解决方案比字典查找更慢。微小优化胜利!;] - Andrew Kennan
是的,我确实做了一个假设,认为他也想加密小写字符,而你的代码没有涉及到这个问题。然而,这样做会更慢一些,我猜测是因为 Unicode 的原因。(我也不介意哪种方法被标记。) - Jonathan Wood

0
你可能考虑使用位运算,它们非常适合加密和解密数据。请参考以下内容。

字节数组加密


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接