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)
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(这是一个不可打印的控制字符)放入您的结果字符串中。
试试这个:
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()方法删除这些破折号.