C# 用于两个十六进制字节数组的XOR函数
我试图执行两字节数组的异或运算,并将结果作为十六进制字符串返回。我已将双字节数组转换为相应的二进制字符串。每个字节都有位,因为它有8个字节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
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(不可打印的控制字符)放入结果字符串中。这样做是正确的-您的代码是两个字符串的异或字符,如果第一个字符串恰好是较长的字符串,则环绕第二个字符串
然而,异或的特性是,只有不同的位保留在输出中。因此,当您XOR0x11
和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();
}
}