TypeCodes

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

上一篇文章主要利用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]
---------------------------------------

即如图所示:

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

打赏支持

Comments »