两个hex字节数组的XOR函数
我试图执行独占或两个字节数组并将结果作为hex字符串返回。 我已将两个字节数组转换为相应的二进制字符串。 每个字节都有位,因为它有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; }
你正确地做到了这一点 – 你的代码是两个字符串的XOR
字符,如果第一个字符串恰好是较长的字符串,则绕着第二个字符串。
但是,XOR的属性使得只有不同的位保留在输出中。 因此,当你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(); } }
这是如何工作的:首先检查数组是否具有相同的长度,如果是这种情况,您将对数组执行XOR操作。 BitConverter.ToString()
方法将字节数组转换为字符串,但由于有连字符分隔每个hex数,您可以使用Replace()
方法删除这些破折号。
我认为string
是错误的类型。 相反,你应该使用BitArray
,它甚至已经有了Xor()
方法。
国际海事组织最好将其分成两部分。 一个函数用于执行分段XOR,另一个函数用于将字节数组转换为hex字符串。
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(); }
现在你可以说:
Console.WriteLine(arrayToHexString(exclusiveOR(arr1, arr2)));
您的解决方案打印奇怪字符的原因是您正在对ASCII值'1'
和'0'
进行异或,因为这些是字符串中的字符。 由于'1'
是0x31而'0'
是0x30,结果是0x30 xor 0x31 = 1.然后将ASCII字符0x01(这是一个不可打印的控制字符)放入结果字符串中。