两个十六进制字节数组的XOR函数

use*_*236 6 c# string logic hex xor

我试图执行独占或两个字节数组并将结果作为十六进制字符串返回.我已将两个字节数组转换为相应的二进制字符串.每个字节都有位,因为它有8个字节.

byte[] key =  { 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 };
byte[] PAN =  { 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x23 };
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经使用了一种方法,将字节数组转换为相应的二进制字符串值,例如"10101010101".但是,当我执行以下方法来获取XOR时,我会返回一串笑脸,这可能是一些特殊的ASCII字符.

但是我对如何做到这一点没有任何想法.我想将二进制字符串转换为整数,但这不是一个好的解决方案,因为它不适合作为整数.

请问您有什么想法吗?可能有一些示例代码?

public static string exclusiveOR(string string_1, string string_2)
{
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < string_1.Length; i++)
        sb.Append((char)(string_1[i] ^ string_2[(i % string_2.Length)]));
        String result = sb.ToString();

        return result;
}
Run Code Online (Sandbox Code Playgroud)

Typ*_*eIA 7

IMO 最好将其分成两部分。一个函数执行分段异或,另一个函数将字节数组转换为十六进制字符串。

public static byte[] exclusiveOR(byte[] arr1, byte[] arr2)
{
    if (arr1.Length != arr2.Length)
        throw new ArgumentException("arr1 and arr2 are not the same length");

    byte[] result = new byte[arr1.Length];

    for (int i = 0; i < arr1.Length; ++i)
        result[i] = (byte) (arr1[i] ^ arr2[i]);

    return result;
}

public static string arrayToHexString(byte[] arr)
{
    var sb = new StringBuilder();
    for (int i = 0; i < arr.Length; ++i)
        sb.Append(arr[i].ToString("x2"));
    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

现在你可以说:

Console.WriteLine(arrayToHexString(exclusiveOR(arr1, arr2)));
Run Code Online (Sandbox Code Playgroud)

您的解决方案打印奇怪字符的原因是您正在对 ASCII 值进行异或'1''0'因为这些是字符串中的字符。由于'1'是 0x31 和'0'0x30,结果是 0x30 xor 0x31 = 1。然后您将 ASCII 字符 0x01(这是一个不可打印的控制字符)放入您的结果字符串中。


Pro*_*FOX 7

试试这个:

public static string exclusiveOR(byte[] key, byte[] PAN)
{
    if (key.Length == PAN.Length)
    {
        byte[] result = new byte[key.Length];
        for (int i = 0; i < key.Length; i++)
        {
            result[i] = (byte)(key[i] ^ PAN[i]);
        }
        string hex = BitConverter.ToString(result).Replace("-", "");
        return hex;
    }
    else
    {
        throw new ArgumentException();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是如何工作的:首先检查数组是否具有相同的长度,如果是这种情况,您将对数组执行XOR操作.该BitConverter.ToString()方法将字节数组转换为字符串,但由于有连字符分隔每个十六进制数,您可以使用该Replace()方法删除这些破折号.


svi*_*ick 5

我认为这string是错误的类型。相反,您应该使用BitArray,它甚至已经有了Xor()方法。


das*_*ght 4

您做得正确 - 您的代码XOR的两个字符串的字符,如果第一个字符串恰好是较长的字符串,则环绕第二个字符串。

然而,XOR 的特性使得只有不同的位保留在输出中。因此,当您与 进行异0x11或时0x12,最终会得到0x03,在控制台上显示时看起来像一颗心。