TypeCodes

C#实现十六进制字符串异或(一)

前面用C/C++实现了两个十六进制的字符串进行异或(查看该文),这篇文章利用C#来实现这个功能。由于C#命名空间里已经封装好了很多类和方法,不用像之前用C实现十六进制字符串异或那样,需要自己写相关的函数,所以能够利用C#很快完成这个字符串异或功能。

用C#实现两个十六进制的字符串进行异或和用C/C++实现两个十六进制的字符串进行异或的思路是一样的,对比着之前用C实现的那篇文章,可以很好理解。

关键点一

弄清十六进制字符串异或的思路:之前是自己写了一个C函数int char2int( char input ),把每个字符串中的单个字符转换成对应的十进制数(范围是0~15),而在C#中直接利用Convert.ToInt32()方法就可以实现了;同样在异或完后,自己用int int2char( char input )函数,根据ASCII码表将范围是0~15的字符转换成对应的占用1字节的字符串中的字符,而在C#中直接利用Int.ToString("X")方法就可以实现整数转换成对应的十六进制字符了。

关键点二

由于这两个十六进制的字符串的长度可能不相等,所以在异或的时候,对于不等长的这两个十六进制的字符串需要先把这两个字符串等长的部分异或完毕。然后再把长度较长的那个字符串未异或的部分copy至异或结果的后面(因为0与任何字符异或得到的结果都是这个字符本身),这个是通过String.Substring(iStartPosition, iLength)实现的。

关键点三

由于Convert.ToInt32(单个字符)方法不会区分这个单个字符是大写还是小写,所以在异或的时候,不用像C那样先把这两个十六进制的字符串全部转成大写。

 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
/**
* C#实现两个十六进制字符串异或实例1
* @FileName:  cHexStrXor.cs
*/
using System;
using System.Text;

public class cHexStrXor
{
    /**
     * C#实现两个十六进制字符串异或的方法1(允许这两个字符串长度不等以及包含大小写)
     * @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;

        /**
         * 把这两个十六进制字符串输出到控制台
         * Console.WriteLine("HexStr1=[{0}]", HexStr1);
         * Console.WriteLine("HexStr2=[{0}]", HexStr2);
         */

        int i = 0;
        try
        {
            //先把每个十六进制字符转换成整数(0~15),异或后再转换成十六进制字符
            for( ; i < iHexStrLenLow; ++i )
            {
                result += (Convert.ToInt32(HexStr1.Substring(i, 1), 16) ^ Convert.ToInt32(HexStr2.Substring(i, 1), 16)).ToString("X");
            }
        }
        catch (Exception e)
        {
            throw new Exception(e.Message);
            /**
             * 把错误信息输出到控制台
             * Console.WriteLine("Exception {0} thrown.", e.GetType().FullName);
             * Console.WriteLine("Message:{0}", e.Message);
             */
        }

        result += iGap >= 0 ? HexStr1.Substring(i, iGap) : HexStr2.Substring(i, -iGap);
        return result;
    }

    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" );
        }
    }
}
用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]
---------------------------------------

即如图所示:

C#实现十六进制字符串异或

打赏支持

Comments »