上一篇文章主要利用C#自带的Convert.ToInt32(HexString, 16)
方法实现了两个十六进制字符串异或的操作。这篇文章主要利用C#字节数组来实现这个功能。
1 实现思路
现将这两个十六进制字符串都转换成对应的字节数组,然后通过数组中每个元素进行异或得到一个0~15范围内的整数,最后将这个整数转换成对应的十六进制字符即可。这个思路和前文《C语言实现十六进制字符串异或》是类似的。
需要注意的是:在调用HexStrToBytes( String HexStr )
方法将将16进制字符串转换成字节数组时,需要捕获异常,避免这个十六进制字符串包含不是十六进制的字符。
2 实现代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 | /**
* C#实现两个十六进制字符串异或实例2
* @FileName: cHexStrXor.cs
*/
using System;
using System.Text;
public class cHexStrXor
{
/**
* C#实现两个十六进制字符串异或的方法2(允许这两个字符串长度不等以及包含大小写)
* @Function: HexStrXor
* @Author : vfhky 2014.11.20 https://typecodes.com
* @param : HexStr1 第一个十六进制的字符串
* @param : HexStr2 第二个十六进制的字符串
* @return : 异或结果(一个十六进制的字符串)
*/
public static String HexStrXor( String HexStr1, String HexStr2 )
{
//两个十六进制字符串的长度和长度差的绝对值以及异或结果
int iHexStr1Len = HexStr1.Length;
int iHexStr2Len = HexStr2.Length;
int iGap, iHexStrLenLow;
String result = String.Empty;
//获取这两个十六进制字符串长度的差值
iGap = iHexStr1Len - iHexStr2Len;
//获取这两个十六进制字符串长度最小的那一个
iHexStrLenLow = iHexStr1Len < iHexStr2Len ? iHexStr1Len : iHexStr2Len;
//将这两个字符串转换成字节数组
byte[] bHexStr1 = HexStrToBytes( HexStr1 );
byte[] bHexStr2 = HexStrToBytes( HexStr2 );
/**
* 把这两个十六进制字符串输出到控制台
* Console.WriteLine("HexStr1=[{0}]", HexStr1);
* Console.WriteLine("HexStr2=[{0}]", HexStr2);
*/
int i = 0;
//先把每个字节异或后得到一个0~15范围内的整数,再转换成十六进制字符
for( ; i < iHexStrLenLow; ++i )
{
result += ( bHexStr1[i] ^ bHexStr2[i] ).ToString( "X" );
}
result += iGap >= 0 ? HexStr1.Substring(i, iGap) : HexStr2.Substring(i, -iGap);
return result;
}
//将16进制字符串转换成字节数组
public static byte[] HexStrToBytes( String HexStr )
{
byte[] Bytes = new byte[HexStr.Length];
try
{
for( int i = 0; i < Bytes.Length; ++i )
{
//将每个16进制字符转换成对应的1个字节
Bytes[i] = Convert.ToByte( HexStr.Substring(i, 1), 16 );
}
}
catch (Exception e)
{
throw new Exception(e.Message);
/**
* 把错误信息输出到控制台
* Console.WriteLine("Exception {0} thrown.", e.GetType().FullName);
* Console.WriteLine("Message:{0}", e.Message);
*/
}
return Bytes;
}
public static void Main( String[] args )
{
while( true )
{
//获取用户输入的两个十六进制字符串
Console.WriteLine( "Please input the first Sting:" );
String HexStr1 = Console.ReadLine();
Console.WriteLine( "Please input the second Sting:" );
String HexStr2 = Console.ReadLine();
//调用异或方法并打印输出结果
Console.WriteLine( "The xor result=[{0}]", HexStrXor( HexStr1, HexStr2 ) );
Console.WriteLine( "---------------------------------------\n" );
}
}
}
|
3 用C#编译命令csc编译执行
用C#编译命令csc命令编译csc/out:c:\users\vfhky\desktop\cHexStrXor.exe c:\users\vfhky\desktop\cHexStrXor.cs
后,用管理员身份打开cHexStrXor.exe
文件。对两个十六进制的字符串按照“长度相等”、“存在小写”和“长度不等”的情况,分别输入如下3组测试数据:
【C#实现两个十六进制字符串异或测试结果:】
[1] 两个长度相等的字符串异或
Please input the first Sting:
F1A37CD826BE0A38
Please input the second Sting:
4FBC926A2EED4F0A
The xor result=[BE1FEEB208534532]
---------------------------------------
[2] 字符串大小写不影响异或结果
Please input the first Sting:
f1a37cd826be0a38
Please input the second Sting:
4FBC926A2EED4F0A
The xor result=[BE1FEEB208534532]
---------------------------------------
[3] 两个长度不同的字符串异或
Please input the first Sting:
4FBC926A2EED40
Please input the second Sting:
F1A37CD826BE0A38
The xor result=[BE1FEEB208534A38]
---------------------------------------
即如图所示:
Comments »