代码之家  ›  专栏  ›  技术社区  ›  LemosLover

c中的XOR字节#

  •  0
  • LemosLover  · 技术社区  · 2 年前

    最近,我看到了一种使用XOR交换2个变量的巧妙方法,并决定在c#中尝试使用字符串交换,尽管我成功地做到了这一点,但我有点担心在XOR操作后必须将int转换为字节。这是代码:

    var string1 = Encoding.ASCII.GetBytes("Hello world1!");
    var string2 = Encoding.ASCII.GetBytes("Hello world2!");
    
    for (var i = 0; i < string1.Length; i++)
    {
        string1[i] = (byte)(string1[i] ^ string2[i]);
    }
    
    for (var i = 0; i < string2.Length; i++)
    {
        string2[i] = (byte)(string1[i] ^ string2[i]);
    }
    
    for (var i = 0; i < string1.Length; i++)
    {
        string1[i] = (byte)(string2[i] ^ string1[i]);
    }
    
    Console.WriteLine(Encoding.ASCII.GetString(string1));
    Console.WriteLine(Encoding.ASCII.GetString(string2));
    

    有更好的方法吗?当我们在做这件事的时候,当你在C#中投射基元时,实际会发生什么?有没有新的内存被分配给它?

    1 回复  |  直到 2 年前
        1
  •  -1
  •   Axel Kemper    2 年前

    随着的引入 tuples in C# 这个 xor 这个把戏实际上不再像以前那么巧妙了:

     var string1 = Encoding.ASCII.GetBytes("Hello world1!");
     var string2 = Encoding.ASCII.GetBytes("Hello world2!");
    
     (string1, string2) = (string2, string1);
    
     Console.WriteLine(Encoding.ASCII.GetString(string1));
     Console.WriteLine(Encoding.ASCII.GetString(string2));
    

    解释了元组语法 here .