C# C语言中字符串的异或运算#

C# C语言中字符串的异或运算#,c#,xor,C#,Xor,我最近开始玩C#,我试图理解为什么下面的代码不能编译。在带有错误注释的行中,我得到: 无法将类型“int”隐式转换为“char”。显式转换退出(是否缺少转换?) 我正在尝试用两个字符串执行一个简单的XOR操作 public string calcXor (string a, string b) { char[] charAArray = a.ToCharArray(); char[] charBArray = b.ToCharArray(); char[] result

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

无法将类型“int”隐式转换为“char”。显式转换退出(是否缺少转换?)

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

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);
}
公共字符串计算器(字符串a、字符串b)
{
char[]chararray=a.ToCharArray();
char[]charbaray=b.ToCharArray();
字符[]结果=新字符[6];
int len=0;
//将长度设置为较短字符串的长度
如果(a.长度>b.长度)
len=b.长度-1;
其他的
len=a.长度-1;
对于(int i=0;i
您正在对2个字符执行异或操作。这将为您执行到
int
的隐式类型转换,因为没有数据丢失。但是,从
int
转换回
char
需要您提供显式转换

对于
结果[i]
,您需要显式地将
int
转换为
char

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

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

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;
}
公共静态字符串xorIt(字符串键,字符串输入)
{
StringBuilder sb=新的StringBuilder();
for(int i=0;i
如果结果值很重要,则Allan是正确的(接受答案)。如果您只是在寻找匹配项,并且不担心性能,那么可以使用strcmp()或memcmp()

在汇编程序中,由于T循环较少,通常通过XOR对自身进行初始化。如果我是蛮力强制(散列比较),那么这将是对strcmp或memcmp的改进,因为我真的不按顺序排序,只按match/nomatch排序


读者还应该知道哪些可以调整。

如果字符串是ASCII,请尝试以下
结果[i]=(char)((短)chararray[i]^(短)charBArray[i])按位运算符仅将数字作为操作数。您的字符串是一系列数字吗?或者您正在尝试基于ASCII值执行此操作?谢谢,我忘记了xor是按位运算符,所以它需要1和0,这就是为什么它抱怨int转换。为了向将来的读者澄清,
按位运算符
不会
需要1和0
。这将是一个
布尔运算符
,它只有两个值。
逐位运算符
作用于两个整数的所有位,生成一个整数。如接受答案所示。代码为+1。但是,在没有适当的伪随机生成器的情况下使用任何流密码都会破坏语义安全原则。我很抱歉这么说,但在您的代码中,使用的PRG远远不是随机的,而且是完全可预测的。事实上,这可以在很短的时间间隔内用纯密文攻击来打破。所以简而言之,永远不要使用这种加密,除非你将它与安全的PRP(伪随机置换)或任何其他类型的可靠安全密码一起使用。我完全同意。如果您想要一个安全的解决方案,请使用可用的工具和框架。他们会用上面提到的PRG和所有其他漂亮的铃铛和口哨为你做正确的工作。我知道,XOR字符串的意义不是很强的安全性,而是在
模糊化中的一步
-使人们更容易反向工程你的代码,以了解你的应用程序在哪里工作。特别是,他们不能简单地搜索你的字符串。他们必须追踪逻辑,找到XOR方法,并通过该方法输入所有字符串,并使用适当的键。IMHO,这个答案与这个问题无关,这个问题与寻找匹配项无关。我会付钱的。我对代码读得太多了。当对字符串进行异或运算时,我通常希望用前导x'00'填充较短的字符串。相反,从LHS的进步让我相信正在寻找匹配,或者正在对模糊数据进行转换。