首页 新闻 会员 周边

c# 实现两个字符串异或

0
悬赏园豆:5 [已解决问题] 解决于 2014-06-27 14:02

两个字符串长度是相等的,怎么做异或呢,最好给具体代码,给思路也行,谢谢啦

下面这段代码是我写的,得出结果是乱码

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);

若心似海的主页 若心似海 | 初学一级 | 园豆:27
提问于:2014-06-26 09:41
< >
分享
最佳答案
0

1、字符串异或的定义是什么?

2、为什么异或后就一定不能是“乱码”?

收获园豆:4
Launcher | 高人七级 |园豆:45045 | 2014-06-26 09:45

就是不懂才问嘛,能给指点下吗,代码写的对不对,不对要怎么写

若心似海 | 园豆:27 (初学一级) | 2014-06-26 09:50

@若心似海: 1、字符串异或的定义是什么? 这得你告诉我啊!

除了你代码中给出的字符串异或定义外,我们还可以有下面的字符串异或方式:

看异或的定义:

a xor b

如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。

那么我可以规定字符串异或的规则为:两个字符串值相同,结果为原字符串;不同为空字符串,那么我们可以得到如下的结果:

"abc" xor "abc" = "abc"

"abc" xor "bcd" = ""

Launcher | 园豆:45045 (高人七级) | 2014-06-26 09:59

@Launcher: 哦,那应该不是这样的,得出的结果肯定是不同于 前两个字符串的

若心似海 | 园豆:27 (初学一级) | 2014-06-26 10:03

@Launcher: 我目前要实现的功能就是 根据两个长度相等的字符串 得出异或的结果,然后这个结果是用来作为一个解密的key使用,所以肯定不是空,两个字符串也绝对不会相同

若心似海 | 园豆:27 (初学一级) | 2014-06-26 10:07

@若心似海: 那你的代码没写错啊,一般我们都是使用字节做异或,跟你写的一样。

Launcher | 园豆:45045 (高人七级) | 2014-06-26 10:12

@Launcher: 哎,我也不知道,我先把他们转换成二进制 做异或,再转换成字符串,结果也一样,那可能就是没错了。可是解密算法也没错,也许是业务流程上还少了什么环节。因为之前从没做过字符串异或,所以怀疑是这出问题

若心似海 | 园豆:27 (初学一级) | 2014-06-26 10:18

@若心似海: 所以我不知道你为什么这样问,因为你没告诉我正确的结果应该是什么样子的。但是根据我的经验来看,你这里的异或结果是用作加解密的 KEY 的场景,那么我们应该使用 ASCII 编码,而非 UNICODE。

Launcher | 园豆:45045 (高人七级) | 2014-06-26 10:22

@若心似海: 我怀疑是编码的问题。通常是这样:

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进制字符串。

Launcher | 园豆:45045 (高人七级) | 2014-06-26 10:46
其他回答(2)
0

异或说的是位亦或,字符串怎么异或```

吴瑞祥 | 园豆:29449 (高人七级) | 2014-06-26 11:13
0
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;
        }
收获园豆:1
s_p | 园豆:138 (初学一级) | 2014-06-26 22:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册