Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于两个十六进制字节数组的XOR函数_C#_String_Hex_Logic_Xor - Fatal编程技术网

C# 用于两个十六进制字节数组的XOR函数

C# 用于两个十六进制字节数组的XOR函数,c#,string,hex,logic,xor,C#,String,Hex,Logic,Xor,我试图执行两字节数组的异或运算,并将结果作为十六进制字符串返回。我已将双字节数组转换为相应的二进制字符串。每个字节都有位,因为它有8个字节 byte[] key = { 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 }; byte[] PAN = { 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x23 }; 到目前为止,我一直使用一种方法将字节数组转换为相应的二进制字符串值,例如“1010101010

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

byte[] key =  { 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 };
byte[] PAN =  { 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x23 };
到目前为止,我一直使用一种方法将字节数组转换为相应的二进制字符串值,例如“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;
}
公共静态字符串排他EOR(字符串1、字符串2)
{
StringBuilder sb=新的StringBuilder();
for(int i=0;i
在我看来,最好将其分为两部分。一个函数用于执行分段异或,另一个函数用于将字节数组转换为十六进制字符串

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

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

这样做是正确的-您的代码是两个字符串的异或字符,如果第一个字符串恰好是较长的字符串,则环绕第二个字符串

然而,异或的特性是,只有不同的位保留在输出中。因此,当您XOR
0x11
0x12
时,您将得到
0x03
,当它显示在控制台上时。

尝试以下操作:

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();
    }
}
公共静态字符串排他EOR(字节[]键,字节[]PAN)
{
if(key.Length==平移长度)
{
字节[]结果=新字节[key.Length];
for(int i=0;i

工作原理:首先检查数组是否具有相同的长度,如果是这样,则对数组执行异或操作。
BitConverter.ToString()
方法将字节数组转换为字符串,但由于每个十六进制数都有连字符分隔,因此可以使用
Replace()
方法删除这些破折号。

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

看起来您正在计算字符的Xor。我想这只在字符串包含Char(0)和Char(1)值时才起作用。我的字符串只包含0和1,但仍然不起作用。它包含字符0还是Char(0)?因为字符0的ASCII值为48。对于ASCII值为49的1也一样,请给出示例输入和预期输出。使用Convert.ToInt32(string_1[i],16)代替string_1[i],并对其他字符进行相同的转换。使用ToString(“X”)而不是char casting将为您提供十六进制字符串.Tks,以供您回复。。。。它现在运转良好。我将只尝试在每四个字符后添加“-”符号,使其类似于0x1234-1234-1234-1234。@Abatonime否:循环的迭代语句
++I
直到循环体运行后才计算
。至于为什么
++i
而不是
i++
,请参阅。在这里,这没有什么区别,但为了养成良好的习惯,我总是在增量之前,除非有特定的需要在增量之后。
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();
    }
}