两个字符串长度是相等的,怎么做异或呢,最好给具体代码,给思路也行,谢谢啦
下面这段代码是我写的,得出结果是乱码
string af = "2423jl4j2ljkj23h4klj2h34lkj2h3k4";
string bf = "ajsd83jdaidu83u2u39823ujd9083209";
byte[] aBytes = System.Text.Encoding.Unicode.GetBytes(af);
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(bf);
byte[] rBytes = new byte[aBytes.Length];
for (int i = 0; i < aBytes.Length; i++)
{
rBytes[i] = (byte)(aBytes[i] ^ bytes[i]);
}
string result = System.Text.Encoding.Unicode.GetString(rBytes);
1、字符串异或的定义是什么?
2、为什么异或后就一定不能是“乱码”?
就是不懂才问嘛,能给指点下吗,代码写的对不对,不对要怎么写
@若心似海: 1、字符串异或的定义是什么? 这得你告诉我啊!
除了你代码中给出的字符串异或定义外,我们还可以有下面的字符串异或方式:
看异或的定义:
a xor b
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
那么我可以规定字符串异或的规则为:两个字符串值相同,结果为原字符串;不同为空字符串,那么我们可以得到如下的结果:
"abc" xor "abc" = "abc"
"abc" xor "bcd" = ""
@Launcher: 哦,那应该不是这样的,得出的结果肯定是不同于 前两个字符串的
@Launcher: 我目前要实现的功能就是 根据两个长度相等的字符串 得出异或的结果,然后这个结果是用来作为一个解密的key使用,所以肯定不是空,两个字符串也绝对不会相同
@若心似海: 那你的代码没写错啊,一般我们都是使用字节做异或,跟你写的一样。
@Launcher: 哎,我也不知道,我先把他们转换成二进制 做异或,再转换成字符串,结果也一样,那可能就是没错了。可是解密算法也没错,也许是业务流程上还少了什么环节。因为之前从没做过字符串异或,所以怀疑是这出问题
@若心似海: 所以我不知道你为什么这样问,因为你没告诉我正确的结果应该是什么样子的。但是根据我的经验来看,你这里的异或结果是用作加解密的 KEY 的场景,那么我们应该使用 ASCII 编码,而非 UNICODE。
@若心似海: 我怀疑是编码的问题。通常是这样:
key1 = {0x01,0x02,0x03,0x04};
key2 = {0x11,0x12,0x13,0x14};
key1 xor key2 = {0x10,0x10,0x10,0x10};
如果在传递数据时使用了字符串,通常会先将 key1 转换成 16进制字符串:
key1 = "FFFFFFFF";
key2="FFFFFFFF"
那么异或前,先将 key1 和 key2 按照16进制字符串转换规则还原成字节数组,异或后的结果,如果你还需要用字符串传递,那么需要将结果转换成16进制字符串。
异或说的是位亦或,字符串怎么异或```
public static string ConvertHexToXor2(string hex) { string xor = ""; for (int i = 0; i < hex.Length; i += 2) { string str = hex.Substring(i, 2); if (xor != "") { xor = (Convert.ToInt64(xor, 16) ^ Convert.ToInt64(str, 16)).ToString("X2"); } else { xor = str; } } return xor; }