//以下是关于 hex 转换为 ascii的代码,一开始还觉得不以为然,但真正动手,还是发现一些急需完善的东东,
//比如考虑输入的问题,还有大小写的问题
//很多情况下,是无法预测用户的输入的,唯一能做的是,把程序完善得非常perfection
#include <iostream>
using namespace std;
int binarySearch(int *a, int len, int val)
{
    int beg, mid, end;
    beg = 0;
    end = len - 1;
    while (beg < end - 1)
    {
        mid = beg + (end - beg) / 2;
        if(a[mid] <= val) beg = mid;
        else end = mid;
    }
    if(a[end] == val) return end;
    else if(a[beg] == val) return beg;
    return -1;
}
#define ISDIGIT(a) ('0' <= (a) && '9' >= (a))
#define ISUP(a) ('A' <= (a) && 'F' >= (a))
#define ISLO(a) ('a' <= (a) && 'f' >= (a))
bool ToUp(char * s)
{
    char *p = s;
    while('0' == *p) ++p;
    if('x' == *p || 'X' == *p) ++p;
    while (*p)
    {
        if(ISDIGIT(*p) || ISUP(*p)) ++p;
        else if(ISLO(*p))
        {
            *p -= 32;
            ++p;
        }
        else return false;
    }
    return true;
}
char ExHexToAscii(const char a, const char b)
{
    char c;
    if(ISDIGIT(a) && ISDIGIT(b)) c = (a << 4) | (b & 0x0F);
    else if(ISDIGIT(a) && ISUP(b)) c = (a << 4) | (b - 0x37);
    else if(ISUP(a) && ISDIGIT(b)) c = ((a - 0x37) << 4) | (b & 0x0F);
    else if(ISUP(a) && ISUP(b)) c = ((a - 0x37) << 4) | (b - 0x37);
    return c;
}
char *HexToAscii(const char *sHex, char *sasc, int len)
{
    const char *p = sHex;
    char *q = sasc;
    while('0' == *p) ++p;
    if('x' == *p || 'X' == *p) ++p;
    if(len % 2) 
    {
        *q = ExHexToAscii('0', *p);
        ++q;
        ++p;
    }
    for (; *p; )
    {
        *q = ExHexToAscii(*p, *(p + 1));
        p += 2;
        ++q;
    }
    return sasc;
}
int main()
{
    char str[1024] = {0};
    char hex[] = "0x313233343536373839d6D0";
    if(ToUp(hex))
    {
        cout << HexToAscii(hex, str, strlen(hex)) << endl;
    }
    else
    {
        cout << "Error" << endl;
    }
    
    return 0;
}