在C#中对字符串进行异或

XOR-ing strings in C#

我最近开始玩C,我试图理解为什么下面的代码不能编译。在错误注释行中,我得到:

Cannot implicitly convert type 'int' to 'char'. An explicit conversion exits (are you missing a cast?)

我正在尝试用两个字符串执行一个简单的XOR操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public string calcXor (string a, string b)
{
    char[] charAArray = a.ToCharArray();
    char[] charBArray = b.ToCharArray();
    char[] result = new char[6];
    int len = 0;

    // Set length to be the length of the shorter string
    if (a.Length > b.Length)
        len = b.Length - 1;
    else
        len = a.Length - 1;

    for (int i = 0; i < len; i++) {
        result[i] = charAArray[i] ^ charBArray[i]; // Error here
    }

    return new string (result);
}


如果使用xor-ing隐藏数据,请查看下面的代码。必要时将重复该键。这可能是一种更短/更好的方法:

1
2
3
4
5
6
7
8
9
public static string xorIt(string key, string input)
{
    StringBuilder sb = new StringBuilder();
    for(int i=0; i < input.Length; i++)
        sb.Append((char)(input[i] ^ key[(i % key.Length)]));
    String result = sb.ToString ();

    return result;
}


您正在对2个字符执行xor。这将为您执行到int的隐式类型转换,因为没有数据丢失。但是,从int转换回char需要您提供一个明确的强制转换。

您需要将您的int显式转换为result[i]char

1
result[i] = (char) (charAArray[i] ^ charBArray[i]);


如果结果的值很重要,那么艾伦是正确的(接受的答案)。如果您只是在寻找匹配项,而不担心性能,那么可以使用strcmp()或memcmp()作为替代方法。

在汇编程序中,由于T循环较少,通常使用XOR对它们自己进行初始化。如果我是强力强制(哈希比较),那么这将是对strcmp或memcmp的改进,因为我确实不排序,只匹配/nomatch。

读者也应该意识到这一点,这是可以调整的。