我手边有一个奇怪的问题。我有一个文本编码的方式,每个字符都被另一个字符替换,我创建一个应用程序,用一个正确的字符替换每个字符。但我遇到了一个我无法解决问题的问题。让我举一个例子:
Original text: This is a line.
Encoded text: (.T#*T#*%*=T50;
现在,正如我所说,每个角色代表另一个角色,'(' T','。'实际上是' h'等等。
现在我可以选择
string decoded = encoded.Replace('(','T'); //T.T#*T#*%*=T50;
这将解决一个问题,但当我达到角色时,T' T'这实际上是编码字符' i'我将不得不更换所有的' T'与' i',这意味着所有先前解码的字母(曾经'(')也会随着编码的#39而改变) ; T'。
//T.T#*T#*%*=T50; -> i.i#*i#*%*=i50;
在这种情况下,显而易见的是,我应该走另一条路,先改变“T' T'到了'我'然后'('到' T',但在文中我改变那种分析不是一种选择。
我可以做些什么来正确执行任务?
谢谢!
答案 0 :(得分:2)
一种可能的解决方案是根本不使用替换字符串方法。
相反,您可以创建一个方法,对于每个编码字符输出已解码的一个,然后通过char
数组遍历您的字符串,并且对于此数组中的每个字符使用"解密"获取解码字符的方法 - 因此您将接收已解码的字符串。
例如(使用StringBulder
创建新字符串):
private static char Decode(char source)
{
if (source == '(')
return 'T';
else if (source == '.')
return 'h';
//.... and so on
}
string source = "ABC";
var builder = new StringBuilder();
foreach (var c in source)
builder.Append(Decode(c));
var result = builder.ToString();
答案 1 :(得分:1)
使用.Replace()
可能不是首先要做的事情,因为您每次都会发现它覆盖整个字符串。一旦你修改了整个字符串一次,编码就会丢失。
相反,循环遍历字符串一次并单独替换字符。
创建一个接受char
的函数并返回已替换的char
。为简单起见,我只会展示签名:
private char Decode(char c);
然后循环遍历字符串并在每个字符上调用该函数。 LINQ可以简单地做到这一点:
var decodedString = new string(encodedString.Select(c => Decode(c)).ToArray());
(这是徒手和未经测试的,您可能需要.ToArray()
string
让StringBuilder
构造函数感到高兴,我不确定。但是您明白了。)< / p>
如果它更容易阅读,您也可以在字符串上手动循环,也可以使用每个连续char
的{{1}}来构建最终的解码结果。
答案 2 :(得分:0)
在不了解您的加密算法的情况下,此答案假设它是一个类似于Caesar Cipher的简单字符翻译。
传入加密字符串,该方法循环遍历每个字符,并按shiftDelta
的值进行调整,并返回结果字符串。
private string Decrypt(string input)
{
const int shiftDelta = 10;
var inputChars = input.ToCharArray();
var outputChars = new char[inputChars.Length];
for (var i = 0; i < outputChars.Length; i++)
{
// Perform character translation here
outputChars[i] = (char)(inputChars[i] + shiftDelta);
}
return outputChars.ToString();
}