神奇的信件

时间:2011-03-17 07:20:24

标签: c# .net winforms

是否可以使用一个字母,例如“A”并将其转换为符号,但仍然可以将其恢复为原始形式(区分大小写)?

例如:

public void doIt(string input)
{
   // do magic work


   // display result
}

*Input = A
*Result = ^$

6 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

如果你不是在谈论一些特定的符号集,并且你只是想以这种方式“加密”你的文本,那么你应该使用你的信的ASCII码,通过一些功能处理它,你会得到你的“加密”字母。然后,将其传递给某个解密函数 - 然后你会收到你的回信。

例如

public char Encrypt(char val)
{
    var ascii = (int)val;
    return (char)(ascii+44);
}

public char Decrypt(char val)
{
    var ascii = (int)val;
    return (char)(ascii-44);
}

如果要打印“enrypted”字符,则必须确保转换功能将它们转换为可打印的字符空间。

答案 2 :(得分:0)

假设您用来转换为“符号”的算法是可逆的,那么可以将其转回。

要获得更准确的答案,您必须在问题中提供更多详细信息。

答案 3 :(得分:0)

var sb = new StringBuilder();
foreach (char ch in input) {
    sb.Append((char)(0x660 + ch));
}
var output = sb.ToString()

// 0x660 should be in the middle of the Arabic block

应该有112个可打印字符,从0x660开始,你在输入中要求输入“字母”。举个例子,我认为字母是[A-Za-z]

如果您的意思是“给定一些UNICODE”可打印的“符号,将其更改为其他UNICODE”可打印“符号”,那就是另一个问题(非常困难)。

答案 4 :(得分:0)

string ORIGINAL_CHARS = "ABCD";
string MAGICAL_CHARS = "$#@%";

public void DoMagic(string input)
{
    string output = input;
    for (int i = 0; i < ORIGINAL_CHARS.Length; i++)
    {
        if(i > MAGICAL_CHARS.Length)
        {
            continue;
        }
        output = output.Replace(ORIGINAL_CHARS[i], MAGICAL_CHARS[i]);
    }
    return output;
}

public void UndoMagic(string input)
{
    string output = input;
    for (int i = 0; i < MAGICAL_CHARS.Length; i++)
    {
        if(i > ORIGINAL_CHARS.Length)
        {
            continue;
        }
        output = output.Replace(MAGICAL_CHARS[i], ORIGINAL_CHARS[i]);
    }
    return output;
}

答案 5 :(得分:0)

您可以使用 XOR 运算符:

private void button7_Click(object sender, EventArgs e)
{
     // Original
     string input = "ala bala portocala";
     Console.WriteLine(input);

     // XORed
     Console.WriteLine(doIt(input));

     // Double XORed to get original back
     Console.WriteLine(doIt(doIt(input)));

}

public string doIt(string input)
{
    var aChars = input.ToCharArray();
    var aCharsRes = new char[aChars.Length];
    for (int i=0; i<aChars.Length; i++)
    {
        aCharsRes[i] = (char)(aChars[i] ^ 1);
    }

    return new string(aCharsRes);
}

修改

可以重构 doIt 函数以利用 LINQ 。这是一个班轮:

 public string doItOneLiner(string input)
 {
     return new string(input.ToCharArray().Select(s => (char)(s ^ 1)).ToArray());
 }