TypeCodes

十六进制字符串异或

十六进制字符串异或是C/C++工作中经常遇到的情况,因此自己写了一个异或方法。程序中关键的三点:

1 关键点一

弄清十六进制字符串异或的思路:一个十六进制字符其实表示的是一个字节的低4位,但是在ASCII码表中,它是作为一个字符,即占用了1个字节。所以需要先把这个字符转换成对应的十进制数(范围是0~15),这个就是int char2int( char input )函数所做的工作;同理在异或完后,需要根据ASCII码表将范围是0~15的字符转换成对应的占用1字节的字符串中的字符,这个就是int int2char( char input )函数所做的工作。

PS:这其实就是前面这两篇文章的提炼—— 《C语言将十进制字符串转成十进制整数》《C语言将十六进制字符串转成十进制整数》

2 关键点二

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

3 关键点三

由于这两个十六进制的字符串的中可能包含小写的字符,所以在异或的时候,先将这两个十六进制的字符串全部转成大写。

基于上面的3点考虑,写出如下代码:

 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
/**
 * C/C++两个十六进制字符串异或
 * @Filename:  hexstrxor.c
 * @author  :  vfhky  2014.11.09  https://typecodes.com/cseries/hexstrxor.html
 */
#include <stdio.h>
#include <string.h>
#include <math.h>

//ASCII码中将字符转换成对应的十进制数
int char2int( char input )
{
    return input>64?(input-55):(input-48);
}

//ASCII码中将十进制数转换成对应的字符
int int2char( char input )
{
    return input>9?(input+55):(input+48);
}

//将十六进制字符串HexStr1和HexStr2异或得到HexStr
void hexstrxor( char * HexStr1, char * HexStr2, char * HexStr )
{
    int i, iHexStr1Len, iHexStr2Len, iHexStrLenLow, iHexStrLenGap;

    //转换成大写并求长度
    strupr( HexStr1 );
    strupr( HexStr2 );
    iHexStr1Len = strlen( HexStr1 );
    iHexStr2Len = strlen( HexStr2 );

    //获取最小的长度
    iHexStrLenLow = iHexStr1Len<iHexStr2Len?iHexStr1Len:iHexStr2Len;

    //获取长度差值
    iHexStrLenGap = abs( iHexStr1Len-iHexStr2Len );

    //两个十六进制的字符串进行异或
    for( i=0; i<iHexStrLenLow; i++ )
    {
        *(HexStr+i) = char2int( HexStr1[i] ) ^ char2int( HexStr2[i] );
        *(HexStr+i) = int2char( *(HexStr+i) );
    }
    if( iHexStr1Len>iHexStr2Len )
        memcpy( HexStr+i, HexStr1+i, iHexStrLenGap );
    else if( iHexStr1Len<iHexStr2Len )
        memcpy( HexStr+i, HexStr2+i, iHexStrLenGap );
    *( HexStr+iHexStrLenLow+iHexStrLenGap ) = 0x00;
}


int main( int argc, char * argv[] )
{
    //两个十六进制的字符串以及异或的结果result
    char HexStr1[] = "F1A37CD826BE0A38";
    char HexStr2[] = "4FBC926A2EED4F0A";
    char result[17] = {0};

    //调用异或方法
    hexstrxor( HexStr1, HexStr2, result );
    //打印异或结果
    printf( "\nresult=[%s]\n", result );

    return 0;
}
4 GCC编译执行

用gcc命令编译gcc hexstrxor.c -o hexstrxor后执行,得到如图结果:

十六进制字符串异或

5 用MFC写了一个异或工具

为了更方便的得到两个十六进制字符串异或的结果,我用MFC写了一个小工具,详见文章《MFC写了一个十六进制字符串异或的工具》

打赏支持

Comments »